私はC++で学校の宿題をしています(まだ学習中です)。私はランダムに生成されたバイナリツリー構造を実装しようとしています。複数の場所にノードの情報を格納するshared_ptrを使用しています(私は宿題のために必要です)。 (これは私の小さなテストプログラムである)次のサンプルコードを考えてみましょう。この場合、C++:vectorのshared_ptrが元のshared_ptrを更新していません
#include <vector>
#include <memory>
struct Node : public std::enable_shared_from_this<Node> {
char charValue;
int intValue;
std::shared_ptr<Node > left;
std::shared_ptr<Node > right;
std::shared_ptr<Node > parent;
std::shared_ptr<Node> getPtr()
{
return shared_from_this();
}
Node() : intValue(0)
{
charValue = 0;
}
};
int main(int argc, char**argv) {
std::vector<std::shared_ptr<Node>> treeQueue;
std::shared_ptr<Node> root = std::make_shared<Node>();
treeQueue.clear();
treeQueue.push_back(root->left); //std::shared_ptr<Node>(root->left)); //root->left->getPtr());
treeQueue.push_back(root->right); //std::shared_ptr<Node>(root->right)); //root->right->getPtr());
treeQueue[1] = std::make_shared<Node>(); //std::shared_ptr<Node>(new Node);
system("PAUSE");
return 0;
}
、私は根をintialize、と私はツリー構造で、それを選択するまでの空の木の他のすべてのノードを維持したいです。私の宿題では、vector treeQueueにプッシュした後、どのノードを選択するかを決めます。 (私はランダムにそこからそれを選ぶ)。
問題:たとえば、上記のコードで、treeQueue [1]を初期化すると、root-> rightも初期化されると思います。彼らは同じポインターなので。しかしそれは空のままです!私はtreeQueue(これもうまくいきませんでした)にプッシュしようとしました。私は "enable_shared_from_this"も試みました。それがそこにあるのです。
これを行う方法はありますか?または、私が必要とするのと同じ機能を提供する別のテクニックがありますか?
生ポインタを使用するのは健康ではないことを知ったので、私はshared_ptrを使用しましたが、今はこの問題が発生します。私を助けてください、私は私の心を失うつもりです。私はできる限りどこでも調べた。私は見つけたものすべてを試しました。
あなたは 'root-> right'が初期化されることを期待していますか?あなたはどこにでも初期化していません。 – lcs
'treeQueue [1] = std :: make_shared()'は 'root-> right'に影響を与えません。空の' shared_ptr'( 'root-> right'のコピー)を新しい値で消去するだけです。 'std :: vector *>' ... –
Jarod42
私はあなたの質問を理解できません。あなたは何を達成しようとしていますか? – Barry