如何安全地共享班级成员
How do I share class members, safely?
我正在努力组织一个程序。我有一个类Solver
,看起来像这样:
class Solver {
...
VarOrder order;
...
vector<Constraint> watches;
vector<Constraint> undos;
...
};
当然,Solver
将这些成员用于其业务。但是,VarOrder
还需要使用watches
和undoes
来完成其业务,并且两个类都需要能够看到彼此的修改。所以似乎我需要传递一个指向watches
的指针,并将成员变量undoes
到 VarOrder
的构造函数中。我想为了安全起见,我应该用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
已完全构造。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 共享 C++ 的数据成员指针
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 在VS2017中,我们如何在项目成员之间共享编译设置
- 如何在成员初始化列表中声明共享指针
- 如何正确使用结构的共享指针成员?
- 复制一个对象并使两者共享一个成员变量 (C++)
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- 共享库中静态功能成员的破坏顺序
- 通过为每个线程独占使用对象(不在线程之间共享)是保护该类的成员函数所必需的
- std::与共享指针模板化成员函数异步
- 返回rvalue的共享_ptr成员
- 共享类时如何隐藏成员功能文件
- 在实例副本之间共享的类成员
- 使用C 中的共享_ptr从公共静态成员函数访问私有构造函数
- 作为类成员的两个类之间的共享指针
- 在两个对象之间共享成员
- 为什么不能共享成员变量?
- 如何在策略之间共享成员