2016-03-30 18 views
0

私の質問は、nullptrにあるderivedClassAの方法で初期化されているので、基本クラスのコンストラクタを呼び出すかどうかです。コードは期待どおりに動作しますが、それでもまだ間違っています。基本クラスのコンストラクタを呼び出す派生クラスのコンストラクタ

長さのために、私はクラスTreeから派生している他のクラスを省略しているが、ここでの考え方は、あなたが派生クラスの任意の数を持つツリーオブジェクトを作成し、getStringExpression()を呼び出すことができるということであり、それが何であれgetStringExpression返します。に評価する。たとえば、Treeのオブジェクトに、DerivedClassAのオブジェクトへのポインタが含まれていて、右の子と左の子が「Car」と「Ride」に等しい場合、Tree.getStringExpression();は「(Car + Ride)」を返します。それぞれのgetStringExpression()メソッドが呼び出されたとき(子がないとき)にそれぞれ文字列 "Car"と "Ride"を返すTreeから派生した具象クラスによってCarとRideの値が返されたとします。

derivedClassAの単一のオブジェクトを作成すると、このオブジェクトはその構築中に作成された2つの子ノードを持つルートノードになるため、derivedClassAの場合と同様にnullptrに基本クラスのコンストラクタを初期化するのは間違いです。このシナリオでは、構築されたTreeはどうなりますか?ポインタがnullptrなので、実際には使用されていないか、またはオブジェクトの接続が解除されているか、または一意であることを示します。derivedClassA ...

これは最も簡単な質問ではありません。

Tree.h-

class Tree 
{ 
public: 
    explicit Tree(Tree *rootNode); 
    virtual ~Tree() {}; 
    virtual std::string getStringExpression() const; 
private: 
    Tree *rootNodePtr = nullptr; 
}; 

Tree.cpp-

#include "Tree.h" 

Tree::Tree(Tree *rootNode) 
{ 
    rootNodePtr = rootNode; 
} 

std::string Tree::getStringExpression() const 
{ 
    if(rootNodePtr != nullptr) 
    { 
     return rootNodePtr->getStringExpression(); 
    } 
     return "Tree has no children"; 
} 

derivedClassA.h-

#include "Tree.h" 
class derivedClassA : 
    public Tree 
{ 
public: 
    derivedClassA(Tree *leftChild, Tree *rightChild); 
    virtual ~derivedClassA(); 
    virtual std::string getStringExpression() const override; 
private: 
    Tree *leftChildPtr = nullptr; 
    Tree *rightChildPtr = nullptr; 

}; 

derivedClassA.cpp-

#include "derivedClassA.h" 

derivedClassA::derivedClassA(Tree *leftChild, Tree *rightChild): Tree(nullptr) 
{ 
    leftChildPtr = leftChild; 
    rightChildPtr = rightChild; 

} 


derivedClassA::~derivedClassA() 
{ 
} 

std::string derivedClassA::getStringExpression() const 
{ 
    auto expressionValue = "(" + leftChildPtr->getStringExpression() + "+" + rightChildPtr->getStringExpression() + ")"; 
    return expressionValue; 
} 

答えて

0

TreeNodeのクラスをマージしたようです。あなたは、それ自体が2人の子供を持っていることを「ルートNodeを持っている必要があり、単一の「ルート」の木、とコンストラクタでTreeを初期化される場合には、NodeTreeから継承されないだろう - 。あなたは二つの別々のクラスを持っているでしょう

それとも抽象Nodeクラスと異なるノードタイプのための扉を開く、2人の子供を持つノードをrepresnetするためにそれを継承BinaryNodeを持っている(以上2人の子供、またはアンバランスの子どもを持つノード)。

ので、あなたの質問に答えるために、はい、あなたがデフォルト値で "ベース"を初期化しているのは奇妙に思えますが、あなたのクラス階層が間違っていると思います。 derivedClassA a Treeではありません。

+0

私はTreeを別のクラスにすることになり、binaryNode抽象クラスに相当するものを作りました。ツリーは、バイナリノード派生クラスへのポインタで構築されます – LBaelish

関連する問題