类对象或指向对象的指针?类对象组合与实现

时间:2013-04-05 00:20:10

标签: c++ class object pointers inheritance

问题背景

我正在制作基本的战舰式衍生游戏,我想继续在C ++中添加功能(无图形)。目前我有一个50 x 75的游戏板,用2D矢量(称为 GameBoard )表示,目前是char类型。我创建了一个游戏板并用'。'设置每个位置。焦炭。当您猜测坐标时,之前猜测的位置标有“ - ”,命中标记为“X”


我参与该计划的地方

我决定修改游戏以启用更多功能。我不是太过分了,但是用伪代码设计草图开始让我更多地思考如何进行升级。

我没有将 GameBoard 作为字符,而是创建一个名为 Block 的类(电路板上的空白区域),它现在将具有ax和y坐标变量,以及一个char变量,可以直观地显示正确的char。 阻止能够保存对象“功能”,该对象分为“功能”的派生类。您可以滚动到最底层,了解有关这些类的更多详细信息。

这是我的类层次结构树的用法:

                             feature 
                    item               vehicle
               gold     nuke                 plane

我需要帮助

我基本上有我想要做的大纲/结构设置。现在我只需要一些帮助来启动它以获得连接的一切。我很难确定何时以及如何使用指针。

A。)我应该更改 GameBoard 来保存 Block 类的指针吗?或实际的阻止对象? - 阻止会指向功能或实际的功能对象吗?

B。)如何添加可以为空或给定值的要素变量?我只是将它设置为NULL吗?

C。)我是否需要自定义复制构造函数来交换阻止功能值?

D。)如果播放器使用阻止,如何从阻止中移除功能对象?

E。)偶尔会在一个阻止上有超过1个功能吗?

F。)如何声明阻止功能类,以便阻止可以容纳功能并且功能已经从另一个类派生(此帖子中未包含)。


关于我的课程的额外详情

所以GameBoard是存储块的向量。块本质上是板上的各个空间。块包含其位置的坐标,表示它的char以及保存 Feature 对象的可能性,但大多数情况下 Block 不会保留某个功能。 功能源自Block并在游戏中充当奖励奖励。因此功能分支到另外两个派生类,即项目功能或车辆。等等。

当玩家选择坐标时,方法将转到GameBoard上的/ Block中的Block,并首先检查char值是否代表之前未使用过的有效空间。然后它检查此Block for Feature的内容。功能可能为空或包含派生的功能对象。

好的,我的小说结束了。很抱歉写这么多。我认为获得帮助的最佳方式是让帮助者知道发生了什么。请不要回应告诉我“要点到点”。我知道我知道..如果我错过了细节,请告诉我。谢谢!

3 个答案:

答案 0 :(得分:1)

我假设你想要保持你的班级结构。在你的抽象点,我建议使用共享和uniqe指针(C ++ 11或Boost)。如果你在指针上非常糟糕,那么学习如何使用uniqe和共享指针,并尝试坚持使用它们。请记住尽可能缩短对象的生命范围。

  

A。)我应该改变GameBoard来保存Block类的指针吗?还是实际的Block对象? Block会保持指向Feature或实际Feature对象的指针吗?

我希望将这个GameBoard元素保存为不可变的uniqe指针或保留实际的实例。

  

B。)如何添加可以为空或给定值的Feature变量?我只是将它设置为NULL吗?

您决定将功能保留在Block内 - 好的。如果是这样,请将其作为共享指针。如果没有功能共享指针将为空。

  

C。)我是否需要自定义复制构造函数来交换Block的功能值?

仅当内部功能中存在动态/异常时。该功能将持有什么?

  

D。)如果播放器使用它,我如何从Block中删除Feature对象?

如果您使用共享指针,则没有问题。即使在处理上一个功能期间功能发生了变化,当GameBoard不再需要功能时,功能也会正确处理并被销毁。

  

E。)偶尔会在一个Block上有多于1个功能吗?

你必须问自己这个问题 - 你的游戏是否需要处理这种情况?如果是这样,只需按住功能的共享指针的vector / map / set / array(取决于您的要求)。

  

F。)如何声明Block和Feature类,以便Block可以保存一个Feature和Feature已经从另一个类派生(本帖子中没有包含)。

我不确定我是否正确理解了这个问题:

class Feature : public GameElement {
   /* Feature implementation */
}

class Block {
    shared_ptr<Feature> mFeature;  
    /* Block implementation */  
};

它能回答你的问题吗?

答案 1 :(得分:0)

  1. 我不确定从班级feature
  2. 派生班级block是否是一个好主意
  3. 我宁愿在feature的每个实例中使用指向block的指针,这样如果没有要素,指针就是NULL此指针将指向您案例中基类feature的指针。我鼓励使用virtual方法访问各个功能。
  4. feature用完时,将其删除并将指针设置为NULL。 (块实例中的指针)
  5. 如果您希望每次featureblock个,请考虑使用某种数组/指针堆栈。
  6. 在我看来GameBoard应该包含Block s的实际实例(不是指针)。
  7. 我不明白你是什么意思:
  8.   

    我是否需要自定义复制构造函数来交换Block的功能值?

    我希望这有助于=)。

答案 2 :(得分:0)

我认为你的GameBoard是GameObject指针的容器是个好主意。您不需要创建一个全新的类并将其称为Block - 所有这些都是隐含的。也不需要跟踪块的坐标,因为它们按顺序排列。 GameObject将是游戏元素层次结构的基类 - 在你的情况下是一个特征,我使用GameObject的原因是因为特征不是很具描述性 - 这个术语过于广泛而且范围很广。

当游戏开始时,您的GameBoard可以由空指针填充,随后由创建并添加到棋盘的实际游戏元素替换。

如果您有动态分配的数据,则只需要实现复制构造函数和赋值运算符。如果没有,编译器将生成一个完美的版本,可以进行原始对象复制。

话虽这么说,你最好不要移动实际的对象实例,并且使用提议的使用指针的方法,你只会移动指针,这更简单,更快。

如果要删除功能,只需删除实际对象并将其在板中的指针设置为null。

如果你实现了父/子关系,你可以在每个块中都有一个GameObjects树,你可以递归遍历那棵树,并按照你的意愿对树元素进行操作。

设计良好的多态层次结构允许您放置几乎任何东西,只要它是从您的基类派生的。