2016-10-13 2 views
0

プログラム全体で異なるオブジェクトに共有される共有ポインタを使用しようとしています。私は、必要なオブジェクトにポインタを渡す前にポインタを作成すると、データがないことに気付きました。これはおそらく、私がどのようにポインタを実装しているかと関係しています。私はデータ(一back)を追加した後に共有ポインタ(pointer_to_vector)を作成した場合、私はそれが動作私がやろうとしています何のサンプルを追加した、と他のオブジェクトの共有ポインタを正しく作成する

int main() { 
    // This would be the data I want to share. For simplicity 
    // using a vector of ints 
    std::vector<int> data; 
    // Create the shared pointer 
    // The objects that are getting access are not allowed to change the 
    // the data so thats why I put in const (could be wrong on what that is 
    // actually doing) 
    std::shared_ptr<const std::vector<int>> pointer_to_vector = 
    std::make_shared<std::vector<int>>(data); 
    // Add data to the object wanting to share 
    data.push_back(1); 
    data.push_back(2); 
    data.push_back(3); 
    data.push_back(4); 
    // If I look at pointer_to_vector in debu at this point it shows no 
    // data, size 0 
} 

を何が起こっているのか。しかし、プログラムの後半でベクターにデータを追加したい場合、ポインタは更新されないので、オブジェクトは新しいデータにアクセスできません。 私が間違っていることがありますか、基本的に私の理解は間違っていますか?

+3

"make_shared"は、 "共有オブジェクトを作成する"ことを意味し、 "オブジェクトを共有する"ことを意味しません。 "私をピザにする"と "私に億万長者にする"の違いと同じです。 – molbdnilo

+0

どのようにオブジェクトを共有させるのですか?私は "*"でポインタの従来の方法を使用する必要がありますか、それはshared_ptrで行うことができますか? – user6768079

+0

オブジェクトが動的に割り当てられている場合は、そのオブジェクトへのポインタを 'shared_ptr'に渡して、' shared_ptr'がそのオブジェクトの所有権を引き受けるようにすることができます。自動オブジェクトまたは静的オブジェクトの場合、そのオブジェクトの所有権を譲渡することはできません。 – molbdnilo

答えて

2

dataは、std::make_shared<std::vector<int>>(data);で作成されたインスタンスとは関係ありません。あなたが本当に欲しい

std::make_shared<std::vector<int>>(data)で作成したベクトルは、初期化のためにコピーをとる

std::shared_ptr<const std::vector<int>> pointer_to_vector = 
std::make_shared<std::vector<int>>(data); 
// Add data to the object wanting to share 
pointer_to_vector->push_back(1); 
pointer_to_vector->push_back(2); 
pointer_to_vector->push_back(3); 
pointer_to_vector->push_back(4); 

です。しかし、インスタンスはまだ無関係です。

+0

申し訳ありませんが、 "all_ints"は "データ"と思われていましたが、それを修正しました – user6768079

+0

@ user6768079私はそれに応じて答えを修正しました。 –

+0

私はpointer_to_vector->を使用したときに、「オーバーロードのインスタンスがありません」というエラーが表示されます – user6768079

0

このコード:

std::vector<int> data; 
auto pointer_to_vector = std::make_shared<std::vector<int>>(data); 

dataのコピーであり、それに共有ポインタを返し、新しいオブジェクトを作成します。要素をdataに追加しますが、新しいベクトルには追加しません。

あなたが書く場合は、:

auto pointer_to_vector = std::make_shared<std::vector<int>>(); 
auto& data = *pointer_to_vector; 

を、あなたが新しく作成されたベクトルを持っている、とdataは、そのオブジェクトへの参照です。後者は、あなたが意図したものに近く見えます。

+0

コードの意味を変えずに、読みやすくするために例を転記するときに 'auto'を使いました。 –

関連する問題