如何让多个类共享指向公共类的指针

How to have multiple classes share pointers to a common class

本文关键字:指针 共享      更新时间:2023-10-16

我试图确定解决设计问题的正确方法,但我正在努力找到"正确"的东西。

简单来说:

  • 我有多个函数类,每个函数类都需要与多个公共类进行交互。(全部使用新在堆上创建)

例如

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 个解决方案:

  1. 使公共类(x,y,z)全局对象(或单例),以便函数类(a,b,c)可以直接调用对象。但是,我不喜欢将事物全球化的想法。
  2. 在初始化期间将指向公共类 (x, y, z) 的指针传递给每个函数类 (a、b、c) 供以后使用。但是,如果删除公共类,则函数类具有过时的指针。
  3. 有一个全局对象(
  4. 可能是单例)来"管理"公共类(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();
}

如果xyz总是一起使用,或者应该懒惰地创建,你可以使用选项 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();
}