c++ - 类对象还是指向它们对象的指针?类对象组合与实现

标签 c++ class object pointers inheritance

问题背景

我正在开发一款类似战舰的基本衍生游戏,我希望随着时间的推移继续使用 C++ 添加功能(无图形)。目前我有一个 50 x 75 的游戏板,用当前类型为 char 的 2D vector (称为 GameBoard)表示。我创建了一个游戏板并用“.”设置了每个位置。字符。当您猜测坐标时,之前猜测的位置标有“-”,命中标有“X”


我在程序方面的进展情况

我决定修改游戏以启用更多功能。我并没有走得太远,但是用伪代码勾勒出一个设计开始让我更多地思考如何才能进行这次升级。

我正在创建一个名为 Block 的类,而不是 GameBoard(棋盘上的空白区域),它现在有一个 x 和 y 坐标变量,以及一个 char 变量以直观地显示正确的 char。 Block 能够容纳对象“Feature”,它分解为“feature”的派生类。您可以滚动到最底部以了解有关这些类的更多详细信息。

我的类层次结构树是这样的:

                             feature 
                    item               vehicle
               gold     nuke                 plane

我需要什么帮助

我基本上已经为我想做的事情设置了大纲/结构。现在我只需要一些帮助来启动它,让一切都连接起来。我很难确定何时以及如何使用指针。

A.) 我应该更改 GameBoard 以保存 Block 类的指针吗?还是实际的Block 对象? - Block 会保存指向Feature 或实际Feature 对象的指针吗?

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

C.) 我是否需要自定义复制构造函数来交换 BlockFeature 值?

D.) 如果玩家使用 Feature 对象,我该如何从 Block 中移除它?

E.) 偶尔在一个 block 上可以有超过1个特征吗?

F.) 我如何声明BlockFeature 类以便Block 可以包含Feature并且 Feature 已经派生自另一个类(不包含在本文中)。


关于我的类(class)的额外细节

因此 GameBoard 是存储 block 的 vector 。 block 本质上是板上的各个空间。 Block 包含其位置的坐标、表示它的字符以及包含 Feature 对象的可能性,但大多数情况下 Block 不会包含要素. Feature 源自 Block,在游戏中充当奖励。因此,Feature 分支为另外 2 个派生类,一个 Item Feature 或 Vehicle。等等。

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

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

最佳答案

我假设您想保留您的类(class)结构。在您的抽象点上,我建议通过(C++11 或 Boost)使用共享指针和唯一指针。如果您不擅长指针,请了解 uniqe 和共享指针的工作原理并尝试坚持使用它们。请记住尽可能缩短对象的生命周期。

A.) Should I change GameBoard to hold pointers of the Block class? Or actual Block objects? And would Block hold a pointer to a Feature or the actual Feature object?

我想将此 GameBoard 元素保留为不可变的唯一指针或保留实际实例。

B.) How do I add a Feature variable that can be empty or given a value? Do I just set it to NULL?

您已决定将 Feature 保留在 Block 中 - 好的。如果是这样,请将其保留为共享指针。如果没有特征共享指针将为空。

C.) Do I need a custom copy constructor to swap the Feature value of Block?

仅当 Feature 中有一些动态/不寻常的东西时。该功能将包含什么?

D.) How do I go about removing the Feature object from Block if the player uses it?

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

E.) Can there be more than 1 Feature on a single Block occasionally?

您必须问自己这个问题 - 您的游戏是否需要处理这种情况?如果是这样,只需保存指向特征的共享指针的 vector/ map /设置/数组(取决于您的要求)。

F.) How do I declare the Block and Feature classes such that Block can hold a Feature and Feature is already derived from another class (not included in this post).

我不确定我是否理解正确:

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

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

它是否回答了您的问题?

关于c++ - 类对象还是指向它们对象的指针?类对象组合与实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15823942/

相关文章:

c++ - QVideoWidget 对齐时不显示任何内容

java - 有人可以确认我的双调序列算法中的最小元素是否正确吗?

c++ - 为什么 `A & a = a` 有效?

c++ - 使用派生类自动转换

c# - C# 中类初始值设定项之间的区别?

java - Object类如何实现clone()方法

c++ - 在类中存储指针或对象?

c++ - 从函数返回局部值而不触发复制构造函数

c# - 通过枚举匹配类

javascript - 如何有效地比较具有不同键但可能匹配值的2个对象?