你能帮我复制 derived class 的 c'tor 吗?
can you help me with the copy c'tor for derived class?
我有这个基地class:
class LevelPlayer
{
protected:
int level;
int id;
public:
LevelPlayer():id(-1){}
LevelPlayer(int level,int id):level(level),id(id){}
virtual ~LevelPlayer()=default;
LevelPlayer(const LevelPlayer&)=default;
LevelPlayer& operator=(const LevelPlayer&)=default;
};
和这个派生的 class:
class GroupPlayer: public LevelPlayer
{
private:
IdPlayer* ptr;
public:
GroupPlayer():LevelPlayer(),ptr(nullptr){}
GroupPlayer(int level,int id,IdPlayer* ptr):LevelPlayer(level,id),ptr(new IdPlayer(*ptr)){}
~GroupPlayer()override=default;
GroupPlayer(const GroupPlayer&);
GroupPlayer& operator=(const GroupPlayer&);
};
对于派生的复制函数,我这样写:
GroupPlayer::GroupPlayer(const GroupPlayer& player):ptr(new IdPlayer(*(player.ptr))){}
但我不确定它是否正确...我是否也应该添加 LevelPlayer(player)
?
看构造函数看
ptr(new IdPlayer(*ptr))
ptr(new IdPlayer(*(player.ptr)))
我得出的结论是,您不需要默认指针和复制构造函数。使成员和第二个构造函数
IdPlayer player;
GroupPlayer(int level, int id, const IdPlayer& player): LevelPlayer(level, id), player{player} {}
而不是 IdPlayer* ptr;
并删除其他构造函数。最后,在代码中标点符号后面使用空格,这样阅读和选码就容易多了。
I am not sure if it's correct ... should I also add LevelPlayer(player)
?
是的,派生的class复制构造函数需要显式调用基础class复制构造函数:
GroupPlayer::GroupPlayer(const GroupPlayer& player)
: LevelPlayer(player), ptr(new IdPlayer(*(player.ptr)))
{
}
由于您已经实现了派生的 class 复制构造函数,并且基础 class 构造函数接受一个输入参数,因此您需要为该参数传递一个值。如果不这样做,将调用基础 class 默认构造函数,因此不会从 player
.
复制 level
和 id
我有这个基地class:
class LevelPlayer
{
protected:
int level;
int id;
public:
LevelPlayer():id(-1){}
LevelPlayer(int level,int id):level(level),id(id){}
virtual ~LevelPlayer()=default;
LevelPlayer(const LevelPlayer&)=default;
LevelPlayer& operator=(const LevelPlayer&)=default;
};
和这个派生的 class:
class GroupPlayer: public LevelPlayer
{
private:
IdPlayer* ptr;
public:
GroupPlayer():LevelPlayer(),ptr(nullptr){}
GroupPlayer(int level,int id,IdPlayer* ptr):LevelPlayer(level,id),ptr(new IdPlayer(*ptr)){}
~GroupPlayer()override=default;
GroupPlayer(const GroupPlayer&);
GroupPlayer& operator=(const GroupPlayer&);
};
对于派生的复制函数,我这样写:
GroupPlayer::GroupPlayer(const GroupPlayer& player):ptr(new IdPlayer(*(player.ptr))){}
但我不确定它是否正确...我是否也应该添加 LevelPlayer(player)
?
看构造函数看
ptr(new IdPlayer(*ptr))
ptr(new IdPlayer(*(player.ptr)))
我得出的结论是,您不需要默认指针和复制构造函数。使成员和第二个构造函数
IdPlayer player;
GroupPlayer(int level, int id, const IdPlayer& player): LevelPlayer(level, id), player{player} {}
而不是 IdPlayer* ptr;
并删除其他构造函数。最后,在代码中标点符号后面使用空格,这样阅读和选码就容易多了。
I am not sure if it's correct ... should I also add
LevelPlayer(player)
?
是的,派生的class复制构造函数需要显式调用基础class复制构造函数:
GroupPlayer::GroupPlayer(const GroupPlayer& player)
: LevelPlayer(player), ptr(new IdPlayer(*(player.ptr)))
{
}
由于您已经实现了派生的 class 复制构造函数,并且基础 class 构造函数接受一个输入参数,因此您需要为该参数传递一个值。如果不这样做,将调用基础 class 默认构造函数,因此不会从 player
.
level
和 id