作为类成员的两个类之间的共享指针
Shared pointer between two classes as class member
我有以下类结构:
class Bar {
private:
std::shared_ptr<std::vector<int>> y_;
public:
Bar(std::shared_ptr<std::vector<int>> p):
y_(p)
{}
int getFirstVal() {return y_->at(0);};
};
class Initialiser {
private:
std::vector<int> x_;
Bar bar_;
public:
Initialiser(std::vector<int>& v):
x_(v),
bar_(std::make_shared<std::vector<int>>(x_))
{}
void set_x(std::vector<int> x) {x_ = x;}
void check(std::vector<int> x){
set_x(x);
std::cout << "New value of x= " << bar_.getFirstVal() << std::endl;
}
};
int main(){
std::vector<int> z = {1,2,3};
Initialiser init(z);
std::vector<int> x_new = {4,5,6};
init.check(x_new); // should print 4
}
在班级初始评估器中,我作为私人成员一个INT的向量和类栏的实例。应用与INT的向量的共享指针初始化栏,该向量应在初始化器和栏之间共享。但是,如果启动器调用X的设置器,则不会影响bar内部的向量。我在 check((中演示了这一点。为什么不 check((打印值4,但仍然值1?
Initialiser(std::vector<int>& v):
x_(v),
bar_(std::make_shared<std::vector<int>>(x_))
{}
您创建一个共享_ptr,指向一个新的向量,即x_的 copy 。自然,修改一个不会影响另一个。
直接方向的解决方案是让启动器和bar保留向量的共享_ptr:
class Initialiser {
private:
std::shared_ptr<std::vector<int>> x_;
Bar bar_;
public:
Initialiser(std::vector<int>& v):
x_(std::make_shared<std::vector<int>>(v)),
bar_(x_)
{}
};
但是,由于bar对象是启动器对象的一部分,因此实际上根本不需要智能指针。条可以简单地将其引用。这里没有终身管理问题,因为BAR_永远不会超过其容器,也不会超过容器bar_。
class Bar {
private:
std::vector<int>& y_;
public:
Bar(std::vector<int>& p):
y_(p)
{}
int getFirstVal() {return y_.at(0);};
};
class Initialiser {
private:
std::vector<int> x_;
Bar bar_;
public:
Initialiser(std::vector<int>& v):
x_(v),
bar_(x_)
{}
};
但是,请注意,x_和bar_的顺序很重要,因此使它有点脆弱。成员变量的构建顺序是它们在类定义中出现的顺序,而不是成员初始化列表中的顺序。如果订单颠倒了,则该程序的行为将不确定,因为BAR_将在x_。
之前构造此正确的排序还确保X_在对象破坏过程中不会超过bar_,因为成员以相反顺序销毁其初始化。
相关文章:
- 给定两个偶数,求出它们之间所有偶数的平方和
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 如何在两个 boost::multi_arrays (C++) 之间执行数学运算?
- 查找字符在两个索引之间出现的次数
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- C++两个源文件之间共享的枚举的静态实例
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 以天C++为单位的两个时间戳之间的差异
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 在C++中查找两个向量之间最相似的值
- 两个有符号数字之间的距离
- Directx 12 :在两个进程之间共享图形内存
- 如何找到两个日期之间的时间差异(以秒和纳秒为单位)?
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 如何找到两个棋盘平面之间的角度?
- 计算两个迭代器之间的距离时"Vector Iterators Incompatible"
- 使用 Dijkstra 算法跟踪两个节点之间的最短路径
- 无法理解代码背后的逻辑,这是在两个给定数字之间生成素数的优化问题