基本上,我希望我的两个类共享一些数据,我想将它作为shared_ptr对象的向量。
我已将代码缩减为以下简单的可编译示例。
我想要对象A,查看在对象B中初始化的数据。但是当我尝试在A的方法中执行push_back()时,它没有改变B中shared_ptr对象的向量的大小。 (在评论“这是兴趣点”的行上。)
我需要使用什么方法来获取此功能,或者我是否在错误的轨道上。 (c ++ newbie here)
#include <memory>
#include <vector>
#include <iostream>
using std::cout;
using std::endl;
class DataClass {
public:
int i_;
};
class B {
public:
// constructor:
B() : my_data_(std::vector<std::shared_ptr<DataClass> >()) {
my_data_.push_back(std::shared_ptr<DataClass> (new DataClass));
my_data_.push_back(std::shared_ptr<DataClass> (new DataClass));
my_data_[0]->i_ = 1;
my_data_[1]->i_ = 2;
cout<<my_data_.size()<<endl;
};
// return the data
std::vector< std::shared_ptr<DataClass> > get_my_data() {
return my_data_;
};
// check the data:
void CheckData() {
cout<<my_data_.size()<<endl; // This is the point of interest
};
// member variable
std::vector< std::shared_ptr<DataClass> > my_data_;
};
class A {
public:
void start() {
// begin interaction with B class:
B b;
// get the vector of data pointers:
a_has_data_ = b.get_my_data();
// modify some of the data:
a_has_data_.push_back(std::shared_ptr<DataClass> (new DataClass));
a_has_data_[2]->i_ = 42;
b.CheckData();
};
private:
std::vector< std::shared_ptr<DataClass> > a_has_data_;
};
int main() {
A a;
a.start();
}
答案 0 :(得分:3)
您正在返回该矢量的副本。您需要返回对数据的引用:
// return the data
std::vector< std::shared_ptr<DataClass> >& get_my_data()
{
return my_data_;
};
那是A
正在访问b
的向量,而不是它的副本。
答案 1 :(得分:1)
a_has_data_.push_back(std::shared_ptr<DataClass> (new DataClass));
如果返回类型是copy,则上述语句将修改a_has_data_
。在b.CheckData();
中,您实际上是在检查b's
成员的大小。
在A
中引入一个成员函数来检查矢量大小,你会看到增加。
答案 2 :(得分:0)
这里在
std::vector< std::shared_ptr<DataClass> > get_my_data()
通过值返回获取值,以便创建新对象。请参阅以下实现。它通过发送指针来解决您的问题。
#include <tr1/memory>
#include <vector>
#include <iostream>
using namespace std;
using std::cout;
using std::endl;
class DataClass {
public:
int i_;
};
class B {
public:
// constructor:
B() : my_data_(std::vector<tr1::shared_ptr<DataClass> >()) {
my_data_.push_back(tr1::shared_ptr<DataClass> (new DataClass));
my_data_.push_back(tr1::shared_ptr<DataClass> (new DataClass));
my_data_[0]->i_ = 1;
my_data_[1]->i_ = 2;
};
// return the data
std::vector< tr1::shared_ptr<DataClass> >* get_my_data() {
return &my_data_;
};
// check the data:
void CheckData() {
cout<<my_data_.size()<<endl; // This is the point of interest
};
// member variable
std::vector< tr1::shared_ptr<DataClass> > my_data_;
};
class A {
public:
void start() {
// begin interaction with B class:
B b;
// get the vector of data pointers:
a_has_data_ = b.get_my_data();
// modify some of the data:
b.CheckData();
a_has_data_->push_back(tr1::shared_ptr<DataClass> (new DataClass));
(*a_has_data_)[2]->i_ = 42;
b.CheckData();
};
private:
std::vector< tr1::shared_ptr<DataClass> >* a_has_data_;
};
int main() {
A a;
a.start();
}
注意:我将代码更改为tr1 / memory,因为我有更旧的gcc。