继承和构造函数的问题

时间:2011-11-13 05:48:10

标签: c++ inheritance

在定义我的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&)

我没有打电话给任何人,我只是让Element从Dict继承。这有什么问题?

另一个错误出现在我的Word类构造函数中,我得到以下内容:

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

在这一点上我真的很沮丧,因为对我来说一切似乎都没问题。

#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) {
        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;
}

3 个答案:

答案 0 :(得分:5)

如果要为自己定义任何构造函数,则需要为类Dict提供不带参数的构造函数。

调用Dict的无参数构造函数从哪里开始?

Word w("blah");

通过调用Word创建Word(string s)个对象。但是,由于Word派生自Element,而Dict又派生自Dict,因此也会调用不带参数的默认构造函数。并且您没有为Dict定义无参数构造函数所以错误。

<强>解决方案:
要么为类Dict() { } 提供一个构造函数,它不需要自己的参数。

Element

或者
Dict中定义一个构造函数,该构造函数在Member Initializer List中调用Element():Dict("Dummystring") { } 的参数化构造函数之一。

{{1}}

答案 1 :(得分:0)

通过声明自己的构造函数,您隐式告诉编译器不要创建默认构造函数。如果你想使用Element类而不向Dict传递任何内容,你还需要声明自己的构造函数。

您收到第二个错误,因为编译器无法正确解析ElementWord的父类。同样,您还必须为Element声明构造函数,以便Word类能够工作。

答案 2 :(得分:0)

构造函数不是继承的,因此您需要Element的构造函数。例如,

Element::Element(string f) : Dict(f) { }