如何安全地共享班级成员

How do I share class members, safely?

本文关键字:共享 成员 何安全 安全      更新时间:2023-10-16

我正在努力组织一个程序。我有一个类Solver,看起来像这样:

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

当然,Solver将这些成员用于其业务。但是,VarOrder还需要使用watchesundoes来完成业务,并且两个类都需要能够看到彼此的修改。所以似乎我需要传递一个指向watches的指针,并将成员变量undoesVarOrder 的构造函数中。我想为了安全起见,我应该用shared_ptr这样做,但指向矢量的指针似乎打开了一大罐可怕的罐子。

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

可能我的类设计是错误的,但除了创建全局数据之外,我不知道如何重新组织它。任何建议表示赞赏。

谢谢。

在这种情况下,不需要使用共享指针,因为这些向量已经与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_watches已完全构造。