【发布时间】:2022-12-09 00:18:31
【问题描述】:
当前使用 C++20。
我正在尝试在初始化期间将来自类 A 的实例的数据共享到它的 B 和 C 的成员实例。我没有使用 getter/setter、单例、依赖注入等,而是想通过将它们作为参数传递到成员类变量的构造函数中来共享数据,其中每个成员实例将通过某种方式持有它们的数据份额(例如引用、原始指针、共享指针、空指针等)。
类 B 和 C 旨在始终初始化为类 A 的成员。最终,A 应该是数据的最后一个“所有者”,这样当A 在销毁期间被释放时,共享数据应该与它一起被释放。考虑到这一点,这些方法中的哪一个是可以接受的?不违反任何重大规则并确保封装?
-
A将数据作为共享指针存储和传递。B&C将参数存储为共享指针。 -
A将数据存储为普通变量,并将它们作为空指针传递。B&C将参数存储为空指针。 -
A将数据存储为普通变量,并将它们作为引用传递。B&C将参数存储为引用。 -
A将数据存储为普通变量,并将它们作为原始指针传递。B&C将参数存储为原始指针。伪代码:
class B { private: // Some variable that holds the shared data }; class C { private: // Some variable that holds the shared data }; class A { private: // Data to be shared to B b; C c; // Data to be shared SomeDataType first; SomeDataType second; public: A() : b{first, second}, c{first} { } };
【问题讨论】:
-
注意“子类”通常是指继承。这些是成员
B和C的实例。 -
你为什么认为你需要智能指针?他们会解决什么问题?为什么不是原始指针?聪明的 poitners 帮助管理所有权,但这里没有什么可管理的。
A有一个成员并且b和c都保证生命周期不长于A实例 -
我会选择选项 3)。此外,我还会在
b和c之前声明first和second,以避免编译器警告并防止在初始化/销毁期间出错。 -
我不会选择 3,因为引用成员具有原始指针所没有的某些含义(例如,没有副本)。原始拥有指针是您需要担心的。永远不会失效的原始非拥有指针是无害的
-
另外,您是否打算在不使用
A的情况下使用B和C?那么谁将拥有这些数据?
标签: c++