如何让多个类共享指向公共类的指针
How to have multiple classes share pointers to a common class
我试图确定解决设计问题的正确方法,但我正在努力找到"正确"的东西。
简单来说:
- 我有多个函数类,每个函数类都需要与多个公共类进行交互。(全部使用新在堆上创建)
例如
A class [a] object needs to be able to call methods in class [x], [y] & [z] objects
A class [b] object needs to be able to call methods in class [x], [y] & [z] objects
A class [c] object needs to be able to call methods in class [x], [y] & [z] objects
到目前为止,我有 3 个解决方案:
- 使公共类(x,y,z)全局对象(或单例),以便函数类(a,b,c)可以直接调用对象。但是,我不喜欢将事物全球化的想法。
- 在初始化期间将指向公共类 (x, y, z) 的指针传递给每个函数类 (a、b、c) 供以后使用。但是,如果删除公共类,则函数类具有过时的指针。 有一个全局对象(
- 可能是单例)来"管理"公共类(x,y,z)和函数类(a,b,c)在需要时从这个全局对象请求一个公共类指针。这使他们能够立即知道指针是否为 NULL。
以前,我使用过(2),但随着时间的推移,我对这种方法不满意。
我想我目前赞成 (3),但仍然对拥有全局对象/单例感到不舒服。
我一直在寻找适合这种情况的设计模式,但找不到任何适合的东西,可能是由于不知道正确的关键字。
这个问题有没有通用的设计方法/模式?
如果不看到问题的更多细节,很难提供建议,但根据您所说的,我会选择选项 2。
如果生存期得到正确管理,最好使用 RAII 和资源管理对象,则在删除功能类之前,没有理由删除公共类。
你说所有的类都是在堆上创建的,new
但你可以使用类似std::unique_ptr
的东西来管理生存期:
#include <memory>
struct X { };
struct Y { };
struct Z { };
class A {
X* x_;
Y* y_;
Z* z_;
public:
A(X* x, Y* y, Z* z) : x_(x), y_(y), z_(z) { }
void doSomething() { /* use x_, y_ and z_ ... */ }
};
// Similarly for B and C ...
int main() {
auto x = std::make_unique<X>();
auto y = std::make_unique<Y>();
auto z = std::make_unique<Z>();
auto a = std::make_unique<A>(x.get(), y.get(), z.get());
a->doSomething();
}
如果x
、y
和z
总是一起使用,或者应该懒惰地创建,你可以使用选项 3 之类的东西,并将它们组合成一个"管理"对象,但如果可以的话,我会避免将该管理对象设为全局/单例,只是通过引用或指针将其传递到函数类的初始化中, 如选项 2:
struct XYZ {
std::unique_ptr<X> x;
std::unique_ptr<Y> y;
std::unique_ptr<Z> z;
XYZ():x(std::make_unique<X>()), y(std::make_unique<Y>()), z(std::make_unique<Z>()){}
};
class A {
XYZ* xyz_;
public:
A(XYZ* xyz) : xyz_(xyz) { }
void doSomething() { /* use xyz_ ... */ }
};
// Similarly for B and C ...
int main() {
XYZ xyz;
auto a = std::make_unique<A>(&xyz);
a->doSomething();
}
相关文章:
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- 共享 C++ 的数据成员指针
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 嵌套类、继承和C++中的共享指针
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 重载流<<运算符,用于指针/共享指针和其他类型的
- RAW指针共享_ptr
- 指针共享习语
- 将memmove函数与临时指针共享相同的地址