我正在学习C ++中的类,抽象类和继承。我正在写一个扮演Cluedo的小个人proyect。

到目前为止,我正在考虑一个基类:

class player
{
protected:
std::string name,character,position;
std::string* hand;
public:
//things he can do
};


然后拥有一个电脑播放器:

class computer:public player
{
private:
fakePlayer* spreadsheet;
public:
//things he can do
};


该计算机基本上是一个播放器,它具有fakePlayer的数组,其中fakePlayer是:

class fakePlayer:public player
{
std::string* hasNot; //card I know he doesn't have
std::string* possibly; //cards he may have
std::string* shown; //cards I hve shown to him
};


fakePlayer不需要characterposition;这是否意味着它不是打字员?我可以做的另一件事是拥有一个仅包含class playername的抽象hand,然后派生类class human:public playerclass fakePlayer:public playerclass computer:public human

拥有不使用某些受保护成员的派生类是否更方便?还是创建一个更通用的抽象类更好?

最佳答案

如果基类的某些数据成员与派生类不相关,则继承设计可能需要引起注意。 (严格来说,这没错。但是,可能还没有完全考虑到这一点。)您似乎已经认识到这一点,所以这很好。

如何解决这种情况通常需要进行一些判断。我首先要问基类(在本例中为player)应体现什么?在我看来,player指的是游戏中的一名玩家,基本上这是您编写的代码。那么,这个“假冒玩家”如何适应画面呢?假冒的玩家需要扮演玩家的角色吗?假冒的玩家应该能够在自己之间玩游戏吗?如果不是,它可能不应继承自player

另一种可能性是具有playerfakePlayer的通用基类(包括player源自fakePlayer的可能性)。现在要问的问题是这个普通基类体现了什么?玩家和假玩家有什么共同点?他们为什么要有一个共同的基层?

随着您对程序的深入了解,您可能会发现使用通用基类的原因。但是,从您显示的代码来看,假冒播放器看起来无非是保持记录。它不是玩家,而是有关玩家的注释。仅凭这一点并不能证明共享基类是合理的。它们可能共享一些辅助类(例如卡类,而不是使用字符串),但不共享基类。我的代码的下一步是从:public player的定义中删除“ fakePlayer”(并可能重命名该类),然后从那里开始。

08-28 16:43