我正在考虑一个问题,并且无法在这两个选项中得出结论性的“更好”。它归结为决定一个复杂的数据成员(即,不是一个原始成员)应该是一个指针还是一个值。 (注意,我已经看到很多关于数据成员的指针与引用的问题,但没有关于指针与值的关系)我正在权衡的最重要的事情是
请考虑以下代码:
class PlayerStatistic
{
int m_MaxValue;
int m_CurrentValue;
// And many other things that round out a player statistic
}
class PlayerStatisticManager
{
//While in this case, it may be better to store stats as a list of some kind and
//identify them by a StatId or something, for this example, I'm declaring them
//individually.
PlayerStatistic* m_pHealth;
//OR
PlayerStatistic m_Health;
// And many more statistics.
}
在上面的例子中,每个玩家总是健康。他们的健康统计数据始终是统计管理器的生命周期,而统计管理器又一直是玩家的生命周期。
如果不是这种情况,我更喜欢指针,以便NULL
可以指示对象不存在(对于并非所有玩家都拥有的统计数据可能更好)。
但是,因为情况并非如此,我认为我宁愿将其存储为值,以减少更大的内存分配,而不是许多小内存分配。
我的想法是否合理,或者有什么我不考虑的事情?
编辑 - 我选择的单词(“指针与价值”)很差。我的意思是澄清了其中一个答案:
你在这里指的是天气,最好有
mHealth
静态或动态分配;
此外,在这种情况下,我知道健康的生命周期是玩家的生命周期,所以我的问题基本上归结为记忆。更好的内存管理是为了减少分配而静态分配数据成员,而是做一个大的分配(当玩家获得新的时候)。
答案 0 :(得分:0)
我认为你的事情有点蠢:“通过引用”或“按值”指的是如何将参数传递给函数。通过指针或值是首选的,因为在这种情况下只传递指向内存位置的指针;例如,对于结构,所有成员都被复制到堆栈中 - 增加了开销。
你在这里指的是天气,最好是静态或动态分配mHealth
;这是一个设计问题,取决于应用程序。两种方式都很好 - 但没有最终更好的解决方案 - 这取决于....
答案 1 :(得分:0)
您需要考虑的一件事是如何使用数据。是否需要通过各种例程进行更改,或者在大多数流程中对其进行简单监控。
如果确实需要更改它并将更改公开给其他例程,最好通过引用传递它,在这种情况下指针将是更好的解决方案。
另一方面,如果它是一个简单的值来监控而不经常更改,我建议按值传递,特别是监控不会经常发生。
在您的情况下,以下是我的分析: 1.如果发生战斗等事件,球员健康可能会经常变化。在这种情况下,数据最好通过引用传递。 2.玩家健康状况在不在战斗中时很少会被一些过程监控,例如当用户查询健康值时。在这种情况下,数据最好按值传递,因此对值的意外更改不会影响对象实例本身。
就个人而言,我会在PlayerStaticManager中使用指针。这提供了在不同场景中传递值或引用的选项。如果需要通过引用传递,请将指针传递给它。如果您需要传递值,请复制内容,将其传递并忘记复制。
希望这有帮助。
答案 2 :(得分:0)
如果成员的生命周期与包含对象的生命周期不同,则仅使用指针。