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

注: 古い gcc を使用しているため、コードを tr1/memory に変更しました。

于 2013-03-01T21:52:19.803 に答える