私はスマートポインタを使ってクラスのための小さなバイナリツリーを作成しなければなりません。 ChildLとChildRがパブリックメンバーであり、私はそれらを直接使用していますが、プライベートメンバーと関数を介してアクセスするツリーを作成するはずです。 コンソールの結果は単なるです:root 私を助けることができますか? 共有ポインタ、バイナリツリーを返すC++ 11、
shared_ptr<Node> createChildL(string n) {
return shared_ptr<Node>(new Node(n));
}
が
ChildL
に割り当てません:私は、Visual Studioに2015
#include <iostream>
#include <memory>
#include <string>
using namespace std;
class Node
{
public:
Node(string n) : name(n) {}
shared_ptr<Node> getChildL()
{
return ChildL;
}
shared_ptr<Node> getChildR()
{
return ChildR;
}
shared_ptr<Node> createChildL(string n)
{
return shared_ptr<Node>(new Node(n));
}
shared_ptr<Node> createChildR(string n)
{
return make_shared<Node>(n);
}
string getName()
{
return name;
}
private:
string name;
shared_ptr<Node> ChildL, ChildR;
};
void PrintTree(shared_ptr<Node> tree)
{
if (tree)
{
cout << tree->getName() << endl;
PrintTree(tree->getChildL());
PrintTree(tree->getChildR());
}
}
int main()
{
shared_ptr<Node> root = make_shared<Node>("root");
root->getChildL() = root->createChildL("leaf");
PrintTree(root);
cin.get();
}
'getChildL'と' getChildR'は 'shared_ptr'を返しますが、これが動作することを期待するなら 'shared_ptr &'を返すべきです。 (N.b.私はそれが良いデザインだとは思わない) –
ildjarn
コードのどこに「ChildL」や「ChildR」が割り当てられているのではないでしょうか。 P.S. [using namespace std; 'を取り除くと、プログラミングの習慣が悪くなります。](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) –
あなたの公開関数はプライベートメンバーへの参照を返すことができますか、またはget&set関数を使用する必要はありますか? – wally