2

本质上,我希望我的 2 个类共享一些数据,我希望将其作为 shared_ptr 对象的向量。

我已将我的代码缩减为以下简单的可编译示例。

我希望对象 A 查看在对象 B 中初始化的数据。但是,当我尝试在 A 的方法中执行 push_back() 时,它并没有改变 B 中 shared_ptr 对象向量的大小。(在符合注释“这是兴趣点”。)

我需要使用什么方法来获得这个功能,还是我走错了路。(这里是 C++ 新手)

#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();
}
4

3 回答 3

4

您正在返回向量的副本。您需要返回对数据的引用:

// return the data
std::vector< std::shared_ptr<DataClass> >& get_my_data()
{
        return my_data_;
};

A是访问b的向量,而不是它的副本。

于 2013-03-01T21:33:06.473 回答
1
a_has_data_.push_back(std::shared_ptr<DataClass> (new DataClass));

由于返回类型是复制,上面的语句将修改a_has_data_. 而在b.CheckData();你实际上是在检查b's成员的大小。

引入一个成员函数A来检查向量大小,您应该会看到增加。

于 2013-03-01T21:34:03.720 回答
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。

于 2013-03-01T21:52:19.803 回答