何时在堆与堆栈上具有类成员

When to have class member on heap vs stack?

本文关键字:成员 堆栈 何时      更新时间:2023-10-16

我正在学习C++对象设计。何时在堆与堆栈上声明类成员?

class RacingLiveEvent
{
public:
    playerlist  *pl;
}

class RacingLiveEvent
{
public:
    playerlist  pl;
}

哪些设计/运行时/编译时注意事项将帮助我做出决定。有什么建议吗?

我看到堆,我可以在自己的头文件中定义每个类。如果我使用静态对象,我需要将所有依赖类放在一个文件中。

编辑:这个问题更多的是关于类设计,而不是指针和引用之间的区别,正如一些主持人/堆栈溢出AI所指出的那样。我们已经在评论中得到了彼得和松布雷罗的一些答案。

如果您需要将成员共享/传递给其他函数/类,请使用指针(更好的shared_ptr(,因为成员很大,因此复制成本很高。

指针允许成员的生存期超过其作用域,

并且如果对象被破坏时,该成员正在其他类或函数中使用,则您希望允许该成员的生存期超过其作用域。

shared_ptr的一个很好的用例是共享同一成员的一些不同类型的对象:

class A{
     public:
     A(std::shared_ptr<SomeType> member) :
     member(member){}
     std::shared_ptr<SomeType> member;
     //
};
class B{
     public:
     B(std::shared_ptr<SomeType> member) :
     member(member){}
     std::shared_ptr<SomeType> member;
     //
}; 

在这里,A 和 B 可以共享同一个成员,如果它们共享,只有当每个正在使用member的人都超出其范围时,member才会死亡。

请注意,如果您使用裸指针与他人共享您的会员不是一个好主意。

除此之外,使用堆栈。