2016-11-13 14 views
-2

私はスマートポインタを使ってクラスのための小さなバイナリツリーを作成しなければなりません。 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(); 
} 
+3

'getChildL'と' getChildR'は 'shared_ptr 'を返しますが、これが動作することを期待するなら 'shared_ptr &'を返すべきです。 (N.b.私はそれが良いデザインだとは思わない) – ildjarn

+1

コードのどこに「ChildL」や「ChildR」が割り当てられているのではないでしょうか。 P.S. [using namespace std; 'を取り除くと、プログラミングの習慣が悪くなります。](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) –

+0

あなたの公開関数はプライベートメンバーへの参照を返すことができますか、またはget&set関数を使用する必要はありますか? – wally

答えて

1

このメンバを使用しています。新しいノードを作成して共有ポインタに埋め込み、それを返します。

あなたは(私は仮定)を実装するかもしれません:

std::shared_ptr<Node> createChildL(std::string n) { 
    ChildL=std::make_shared<Node>(n); 
    return ChildL; 
} 

をそれが最善の方法ではないのですが。

void setChildL(const std::shared_ptr<Node>& left) { 
    ChildL=left; 
} 

をあなたはおそらく不変ツリーに従う方法で、ノードの挿入/除去(例えばChildLを処理するためのBinaryTreeクラスを構築したい:あなたがやろうとしているすべてのカプセル化は取得/設定のペアを実装することを検討している場合 - > n < = nおよび各ノードのChildR-> n> n)。

+1

私は特定のインターフェイスを使用する必要があるので、これは正しい方法だと思います。あなたの変更されたcreateChildを使用して解決策:) :)ありがとう! – haxpiotr

関連する問題