継承とコンストラクタの問題

Elementクラスを定義する際、次のエラーが発生します。

no matching function for call to ‘Dict::Dict()’ word1.cpp:23:
    note: candidates are: Dict::Dict(std::string) word1.cpp:10:
    note: Dict::Dict(const Dict&)

私は何も呼んでいない、私は要素をDictから継承させるだけだ。ここで何が問題なの?

もう1つのエラーは、私のWordクラスのコンストラクタで次のようになります:

In constructor ‘Word::Word(std::string)’: word1.cpp:71:
    note: synthesized method ‘Element::Element()’ first required here

私はすべてが私に大丈夫だと思われるので、この時点では本当に不満です。

#include 
#include 
#include 
#include 
#include 

using namespace std;

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

    Dict(string f) {
        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 { //Error #1 here 
    //Don't need a constructor
    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:
      string temp;
      Word(string s){//Error #2 here
          temp = s;
      }
      void complete(const Dict &d){cout << d.words[0];}
};

int main()
{
    Dict mark("test.txt"); //Store words of test.txt into vector
    string str = "blah"; //Going to search str against test.txt
    Word w("blah"); //Default constructor of Word would set temp = "blah"
    return 0;
}
ベストアンサー

コンストラクタを自分で定義する場合は、クラス Dict
に引数を取らないコンストラクタを指定する必要があります。

From where does the no parameter constructor for
Dict get invoked?

Word w("blah");

Word(string s)を呼び出して Word
オブジェクトを作成します。しかし、 WordElement
から派生しています。これは Dict から派生しています。 。また、 Dict
に定義されているパラメータコンストラクタがないため、エラーです。

Solution:
Either to provide a constructor for class Dict which
takes no parameters yourself.

Dict()
{
} 

または
Member Initializer Listの Dict
のパラメータ化されたコンストラクタの1つを呼び出す Element にコンストラクタを定義します。

Element():Dict("Dummystring")
{
} 

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です