2011-11-13 13 views
0

DictのコンストラクタであるDict(string f)を継承できるようにしたいと考えていました。ただし、直接継承ではないため、直接行うことはできません。それはツリーに続き、最後の親はElementクラスです。直接親ではない基底クラスからコンストラクタを継承する方法

どのようにすれば、WordクラスがWordクラス( "test.txt")を実行できるように、基本クラスのインストラクタ(Dict)からWordクラスに継承させることができるかをコンパイラに知らせることができます。メインでのインスタンス化?

#include <iostream> 
#include <vector> 
#include <sstream> 
#include <string.h> 
#include <fstream> 

using namespace std; 

class Dict { 
public: 
    string line; 
    int wordcount; 
    string word; 
    vector <string> words; 

    Dict(string f) { // I want to let Word inherit this constructor 
     ifstream in(f.c_str()); 
     if (in) { 
      while(in >> word) 
      { 
       words.push_back(word); 
      } 
     } 
     else 
      cout << "ERROR couldn't open file" << endl; 

     in.close(); 
    } 
}; 

class Element : public Dict { 
public: 
    virtual void complete(const Dict &d) = 0; 
    virtual void check(const Dict &d) = 0; 
    virtual void show() const = 0; 
}; 

class Word: public Element { 
public: 
    Word(string f) : Dict(f) { }; // Not allowed (How to fix?) 

    void complete(const Dict &d) { }; 
}; 
}; 

int main() 
{ 
    //Word test("test.txt"); 
    return 0; 
} 

答えて

4

Elementクラスは、問題のコンストラクタDictを呼び出す能力を公開する必要があります。 C++ 98/03で

、これはElement代わりDictコンストラクタのElementコンストラクタを使用する単純Dictコンストラクタを呼び出すとまったく同じパラメータを持つコンストラクタを定義し、Wordなければならないことを意味します。

C++ 11では、constructor inheritanceを使用すると、多くのタイピングを保存してエラーを防ぐことができます。

2

あなたElementクラスはに次のコンストラクタを提供する必要があります:あなたは、その後Dictまでコールを伝播する、あなたのWordクラスからElementコンストラクタを呼び出すことができるようになります

Element(string iString) : Dict(iString) {;} 

関連する問題