你能帮我复制派生类的 c'tor 吗?



我有这个基类:

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 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)

我不确定它是否正确。。。我是否也应该添加LevelPlayer(player)

是的,派生类复制构造函数需要显式调用基类复制构造函数:

GroupPlayer::GroupPlayer(const GroupPlayer& player)
: LevelPlayer(player), ptr(new IdPlayer(*(player.ptr)))
{
}

由于您已经实现了派生类复制构造函数,并且基类构造函数接受一个输入参数,因此需要为该参数传递一个值。如果不这样做,则会调用基类默认构造函数,因此levelid不会从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} {}

而不是CCD_ 6,并移除其他构造函数。最后,在代码中的标点符号后面使用空格,这使得阅读和代码选择更加容易。

最新更新