我试图确定设计问题的正确方法,但我很难找到正确的方法。
简单来说:
例如
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个解决方案:
以前,我已经使用了(2),但随着时间的推移,我对这种方法感到不满。
我认为我目前偏爱(3),但仍然对拥有全局对象/单身人士感到不舒服。
我一直在寻找适合这种情况的设计模式,但找不到合适的东西,可能是由于不知道正确的关键字。
这个问题有共同的设计方法/模式吗?
答案 0 :(得分:0)
如果没有看到问题的更多细节,很难提供建议,但根据你的说法,我会选择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();
}