Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OOP中的成员与子类_C++_Oop - Fatal编程技术网

C++ OOP中的成员与子类

C++ OOP中的成员与子类,c++,oop,C++,Oop,我决定通过编写一个基于文本的RPG游戏来记住几年前我在面向对象编程课上学到的东西。我不确定我是否希望完成这项工作,我也不太在乎。我只是想重新学习如何编写程序 记住了函数、数据类型和类在C++中工作的基本知识之后,我编写了以下代码: class Character { string Name; public: Character() { Name = "Charname"; } string GetNam

我决定通过编写一个基于文本的RPG游戏来记住几年前我在面向对象编程课上学到的东西。我不确定我是否希望完成这项工作,我也不太在乎。我只是想重新学习如何编写程序

记住了函数、数据类型和类在C++中工作的基本知识之后,我编写了以下代码:

class Character
{
      string Name;

public:
       Character()
       {
           Name = "Charname";
       }

       string GetName(){return Name;}
       void SetName(string sName){Name=sName;}
};
现在我希望我的角色有种族。第一个想法是创建类角色的子类,每个允许的种族一个。在我看来,这就像是在面向对象编程中要做的事情。但我开始思考它将如何工作。我希望能够这样说:“如果汤姆是人类,克拉拉是兽人,而汤姆和克拉拉试图结婚,请给出一个错误信息。”我可能还希望人类和兽人有不同的方法来做不同的事情

在我看来,广义上,在前者中,我想将种族视为角色的成员(我理解为属性),而在前者中,我想将种族视为子类

如果人类是性格的一个子类,那么前者是否可能呢?也就是说,对象可以知道它在哪个类中吗


我应该做什么?为什么?

这个设计问题被称为“专业化”。在这种情况下,您希望Race是一个属性,而不是一个子类,因为所有种族的行为基本上是相同的。在种族赋予特殊能力的情况下,以统一的方式处理所有种族的特殊能力。例如,想象只有一些种族在黑暗中才能看到,这就是你的做法:

int getVisionRange( int iCurrentLightLevel ){
    if( iCurrentLightLevel < LightLevel.DIM ){
       if( this.race == ORC || this.race == ELF ){
           return VisionRange.GOOD;
       } else {
           return VisionRange.NONE;
       }
    } else {
       return MAX_VISION_RANGE;
    }
}
int getVisionRange(int-iCurrentLightLevel){
if(iCurrentLightLevel

或者类似的东西。

虚拟函数与子类化相结合可能是您想要的。您可以使用名为
getRace()
或类似的方法,并为每个类适当地定义它。谢谢。你能让我参考一些详细解释这个问题的文字吗?我刚刚在谷歌上搜索了一下,我看到了一些解释,但通常都很简短。是否有可访问的概述和示例?在我看来,这里一定有灰色地带,如果我能读到它,那就太好了。Bruce Eckel的C++思想是一本标准的书,他解释得很清楚。对于初学者和经验丰富的程序员也很好。此外,Gamma的设计模式也是一个经典。Metz的《Ruby中的实用面向对象设计》是一本关于OO设计“哲学”的新书。(一旦你看完这些书,这里有一个小贴士给你:抛弃OO编程,这是浪费时间。从长远来看,使用你自己的逻辑会更好。OO这样的范例只是分散你的注意力。从头解决每一个问题,最终会有回报。)@TylerDurden所说的“抛弃”是指“完全忽略”吗,或者你的意思是“不要盲目坚持”?如果你指的是后者,那么肯定是(OO只是一个工具,和任何工具一样,它有时根本没有用处)。另一方面,如果你指的是前者,那么如果没有强有力的支持理由,这是一个非常非常大胆的说法。