我如何安全地分享班级成员?

时间:2014-01-11 15:01:42

标签: c++

我正在努力组织一个项目。我有一个班级Solver,看起来像这样:

class Solver {
   ...
   VarOrder order;
   ...
   vector<Constraint> watches;
   vector<Constraint> undos;
   ...
};

当然Solver将这些成员用于其业务。但是,VarOrder还需要使用watchesundoes来执行 业务,这两个类都需要能够看到彼此的修改。所以我似乎需要将指向watchesundoes成员变量的指针传递给VarOrder的构造函数。我想我应该用shared_ptr做到这一点是安全的,但指向矢量的指针似乎打开了一大堆可怕的东西。

我也可以使用C ++的“朋友”功能,但这似乎也是错误的,因为VarOrder只需要访问两个Solver的成员,而不是所有成员,这似乎喜欢这将是奇怪的设计。

可能我的班级设计错了,但没有创建全局数据,我不知道如何重组这个。任何建议表示赞赏。

谢谢。

1 个答案:

答案 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}}是完全构造的。