复制派生类之间的构造函数

时间:2011-07-21 22:42:09

标签: c++ oop abstract-class copy-constructor

如何将派生类复制到另一个?

我在术语上有缺陷,所以我将尝试用一个例子来说明。

我们正在玩电脑玩家和人类玩家的纸牌游戏。卡和命令是其他类。

class Player
{
    Card *Hand[4];
    // etc...
};

class Human: public Player
{
    Command getCommand();
    void PlayCard(Card card);
    void quit();
    // etc...
};

class Computer: public Player
{
    Command ai();
    void PlayCard(Card card);
    // etc...
};

在我们的主要功能中的某个地方......

// ...
Human p1; // Assume initialized and usable.
if(p1.getCommand() == QUIT)
{
    cout << "PLAYER 1 RAGEQUITS WHAT A NOOB LOL << endl;
    cout << "A COMPUTER WILL NOW TAKE OVER." << endl;
    p1.quit()
    p1 = new Computer(); // THE IDEA BEING THAT WE WANT TO PRESERVE p1's MEMBERS.
}
// ...

我要做的是将p1转换为“计算机”,同时保留其成员的状态。

我们是否使用复制构造函数来执行此操作?如果没有,你使用什么方法?

编辑:这是使用赋值运算符的方法吗?

Computer& Human::operator=(const Human &h) // Assignment operator
{
    Hand = h.Hand;
    member2 = h.member2;
    member3 = h.member3;
    ...

    return *this;
}

我们是否需要删除/释放主要内容?

4 个答案:

答案 0 :(得分:5)

这里有设计问题。如果你想在保持公共成员变量的同时将玩家从人类切换到计算机,那么你应该以这种方式构建你的类。

class Player
{ 
public:
    friend class Human;    // These friends are necessary if the controllers
    friend class Computer; // need access to Player's private data.

    Card hand[4];
    Controller* controller;
};

class Controller
{
public:
    virtual Command getCommand(Player const&) = 0;
};

class Human : public Controller
{
public:
    Command getCommand(Player const&) { /* get command from user input */ }
};

class Computer : public Controller
{
public:
    Command getCommand(Player const&) { /* get command from AI */ }
};

然后,当您需要从人体切换到计算机时,只需更换控制器即可。

p1->controller = new Computer();

这样,卡片将被维护,只有控制机制会被更改。

答案 1 :(得分:2)

您可以使用构造函数。对于这个特殊情况,我可能有一个名为“CopyGameState”的方法。

答案 2 :(得分:2)

复制构造函数用于将现有对象复制到同一类的新实例。

您需要的是一个赋值运算符(operator=),它允许为您的现有类对象分配不同类型的值。

答案 3 :(得分:2)

它不是复制构造函数,而是转换构造函数。类似的东西:

Computer::Computer(const Player& had_to_go) : Player(had_to_go) {}

这将使用Player的复制构造函数来保留公共基类中的成员。

当然,您最好在"rule of three"之后完成Player::Player(const Player&)工作。

最后,你会做类似的事情:

p1.quit();
Computer* replacement = new Computer(p1);
delete p1;
p1 = replacement;