2017-07-15 16 views
-3

LinuxおよびMac OS用に開発されたコードを継承しました。今、私はVisual Studioを使ってWindowsに移植しています。私がVisual Studio 2010でビルドしようとしたとき、私は以下のエラーを受けました。 簡略化されたクラスの構造を以下に報告します。C++クラスの継承継承に関する設計上の問題

Nodeクラスを考えてみましょう:

isLeafgetNodeListは純粋仮想メソッドです
class Node 
    { 
    public: 

     Node();  
     virtual ~Node(){} 

     virtual bool isLeaf() const = 0; 
     /* other methods */ 
     virtual vector<Node *>& getNodeList() const=0; 
    }; 

class CompositeNode : public Node 
    { 
    public: 
     CompositeNode(){ cout << "CompositeNode constructor";} 
     ~CompositeNode(){ cout << "CompositeNode destructor";} 
     bool isLeaf() const { return false;} 
     vector<Node *>& getNodeList() const{ 
       return m_NodeList; 
     } 

    private: 
     vector<Node*> m_NodeList 


    }; 

純粋仮想メソッドの両方を実装します。ちょうどisLeaf方法、およびCompositeNodeを実装

次に、2つの派生クラスLeafNode

class LeafNode : public Node 
{ 
public: 
    LeafNode(){ cout << "leaf constructor";} 
    ~LeafNode(){ cout << "leaf destructor";} 
    bool isLeaf() const { return true; } 
    vector<Node *>& getNodeList() const {} 

}; 

。 私は、Visual Studioでこのコードをビルドしようとすると、私は次のエラーを取得する:

error C4716: 'LeafNode::getNodeList()' : must return a value 

私はコンパイラを理解するが、私はこの状況を管理する方法を知りません。 この問題を解決するには、クラスをどのように再設計する必要がありますか? ありがとうございました。

+0

このコードは、g ++、clang、または他のC++コンパイラでコンパイルする必要があるのでしょうか。 IMHO、すべてのC++コンパイラは、この場合VC++のような同様のエラーを生じるはずです。 – Scheff

+1

これは、継承やクラスとは関係ありません。 – juanchopanza

答えて

1

I understand the compiler, but I don't know how to manage this situation. How should I redesign the class to solve this problem?

LeafNode::getNodeListは空のリストのみを返すことができます。また、

virtual void isLeaf() const = 0; 

は適切ではない

vector<Node *>& getNodeList() const 
{ 
    static vector<Node *> empty; 
    return empty; 
} 

:としてそれを実装します。

virtual bool isLeaf() const = 0; 
+0

あなたが正しいです、isLeafはboolを返す必要があります。だから、一般的には、これらの場合に静的な空のデータ構造体を返すのは正しいですか? @paperox、並べ替えの。 – paperox

+0

理想的には、戻り値を 'ベクトル const&'にしたいので、呼び出し関数は返されたオブジェクトを変更しません。 –

+0

@paperox - 関数がそれを満たすことができない場合、関数*であるため、なぜそれがインターフェイスの必須部分であるのか疑問に思うはずです。例外をスローすることもできますが、それは怠惰なIMOです。設計を改善し、実装できないインタフェース・メンバを持たないようにする必要があります。 – StoryTeller