如何将派生类复制到另一个?
我在术语上有缺陷,所以我将尝试用一个例子来说明。
我们正在玩电脑玩家和人类玩家的纸牌游戏。卡和命令是其他类。
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;
}
我们是否需要删除/释放主要内容?
答案 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;