我正在努力组织一个项目。我有一个班级Solver
,看起来像这样:
class Solver {
...
VarOrder order;
...
vector<Constraint> watches;
vector<Constraint> undos;
...
};
当然Solver
将这些成员用于其业务。但是,VarOrder
还需要使用watches
和undoes
来执行 业务,这两个类都需要能够看到彼此的修改。所以我似乎需要将指向watches
和undoes
成员变量的指针传递给VarOrder
的构造函数。我想我应该用shared_ptr
做到这一点是安全的,但指向矢量的指针似乎打开了一大堆可怕的东西。
我也可以使用C ++的“朋友”功能,但这似乎也是错误的,因为VarOrder
只需要访问两个Solver
的成员,而不是所有成员,这似乎喜欢这将是奇怪的设计。
可能我的班级设计错了,但没有创建全局数据,我不知道如何重组这个。任何建议表示赞赏。
谢谢。
答案 0 :(得分:2)
在这种情况下不需要使用共享指针,因为这些向量已经与VarOrder
一起分配在堆栈上,因此它们将在彼此的生命周期中存在。让VarOrder
将引用带给其他人(因此不会出现空指针)。
class VarOrder {
private:
vector<Constraint>& _watches;
vector<Constraint>& _undos;
public:
VarOrder(vector<Constraint>& watches,
vector<Constraint>& undos) : _watches(watches)
, _undos(undos) {
}; // eo ctor
}; // eo class VarOrder
class Solver {
private:
vector<Constraint> _watches;
vector<Constraint> _undos;
VarOrder _order;
public:
Solver() : _undos()
, _watches()
, _order(_watches, _undos) {
}; // eo ctor
}; // eo class Solver
请注意,成员在初始化列表中按照在类中声明的顺序进行初始化,因此当_order到达构造时,_undos
和{{ 1}}是完全构造的。