我正在尝试使用 C++ 和 SDL 编写一个简单的游戏。我的问题是,存储类成员变量的最佳实践是什么。
MyObject obj;
MyObject* obj;
我在类似的问题中读到了很多关于尽可能消除指针的内容,但我记得几年前我读过的一些书中他们经常使用它(对于所有不平凡的对象)。另一件事是,SDL 在其许多函数中返回指针,因此在处理 SDL 对象时我必须经常使用“*”。
当我认为使用默认构造函数以外的方式初始化第一个构造函数的唯一方法是通过初始值设定项列表时,我是对的吗?
最佳答案
通常,使用值成员优于指针成员。但是,也有一些异常(exception),例如(这个列表可能不完整,只包含我可以立即想到的原因):
- 当成员很大时(使用
sizeof(MyObject)
来找出答案),对于访问权限而言,差异通常并不重要,而堆栈大小可能是一个问题。 - 当对象来自其他来源时,例如,当有工厂函数创建指针时,通常没有其他方法来存储对象。
- 如果对象的动态类型未知,则使用指针通常是唯一的选择。然而,这种情况不应该像平常那样常见。
- 当存在比直接所有者更复杂的关系时,例如,如果一个对象在不同对象之间共享,则使用指针是最合理的方法。
在所有这些情况下,您不会直接使用指针,而是使用合适的智能指针。例如,对于 1.,您可能想要使用 std::unique_ptr<MyObject>
以及 4.a std::shared_ptr<MyObject>
是最好的选择。对于 2.,您可能需要使用这些智能指针模板之一与合适的删除器函数相结合来处理适当的清理(例如,对于从 FILE*
获得的 fopen()
,您可以使用 fclose()
作为删除器函数;当然,这是一个虚构的示例,因为在 C++ 中您无论如何都会使用 I/O 流)。
一般来说,我通常完全在成员初始值设定项列表中初始化对象,与成员的准确表示方式无关。但是,是的,如果您的成员对象需要构造函数参数,则需要从成员初始值设定项列表传递这些参数。
关于c++ - C++中如何存储类成员对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18522382/