在定义我的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;
}
答案 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
传递任何内容,你还需要声明自己的构造函数。
您收到第二个错误,因为编译器无法正确解析Element
类Word
的父类。同样,您还必须为Element
声明构造函数,以便Word
类能够工作。
答案 2 :(得分:0)
构造函数不是继承的,因此您需要Element的构造函数。例如,
Element::Element(string f) : Dict(f) { }