저는 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;
}
, 내가 루트를 초기화하기, 그리고 내가 트리 구조를 선택할 때까지 빈 나무의 다른 모든 노드를 유지하려면 . 그리고 숙제에서, 나는 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