gpt4 book ai didi

c++ - 作为类成员的两个类之间的共享指针

转载 作者:行者123 更新时间:2023-11-27 22:45:28 25 4
gpt4 key购买 nike

我有以下类结构:

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



}

在 Initialiser 类中,我有一个 int vector 和 Bar 类的一个实例作为私有(private)成员。 Bar 应该使用指向 int vector 的共享指针进行初始化,并且该 vector 应该在 Initialiser 和 Bar 之间共享。然而,目前,如果 Initialiser 调用 x 的 setter,这不会影响 bar 内的 vector 。我在 check() 中演示了这一点。为什么 check() 不打印值 4 而仍然是值 1?

最佳答案

Initialiser(std::vector<int>& v):
x_(v),
bar_(std::make_shared<std::vector<int>>(x_))
{}

您创建一个 shared_ptr,它指向一个新 vector ,即 x_ 的拷贝。当然,修改一个不会影响另一个。

直接的解决方案是让 Initialiser 和 Bar 都持有指向 vector 的 shared_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 对象是 Initialiser 对象的一部分,因此根本不需要智能指针。 Bar 可以简单地保存对 vector 的引用。这里不存在生命周期管理问题,因为 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++ - 作为类成员的两个类之间的共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43630220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com