#c #inheritance
#c #наследование
Вопрос:
При определении моего класса элементов я получаю следующую ошибку:
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 Dictamp;)
Я ничего не вызываю, я просто разрешаю элементу наследовать от 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 amp;d) = 0;
//virtual void check(const Dict amp;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 amp;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;
}
Ответ №1:
Вам нужно предоставить конструктор, не принимающий аргументов для вашего класса Dict
, если вы определяете какой-либо конструктор для него самостоятельно.
Откуда вызывается конструктор no parameter для Dict
?
Word w("blah");
Создает Word
объект путем вызова Word(string s)
. Однако, поскольку Word
является производным от Element
, которое, в свою очередь, является производным от Dict
, также будут вызваны их конструкторы по умолчанию, которые не принимают параметров. И у вас нет конструктора без параметров, определенного для Dict
Поэтому ошибка.
Решение:
Либо самостоятельно предоставить конструктор для класса Dict
, который не принимает параметров.
Dict()
{
}
Или
определите конструктор, в Element
котором вызывается один из параметризованных конструкторов Dict
из списка инициализаторов элементов.
Element():Dict("Dummystring")
{
}
Ответ №2:
Объявляя свой собственный конструктор, вы неявно указываете компилятору не создавать конструктор по умолчанию. Если вы хотите использовать Element
класс, ничего не передавая Dict
, вам также необходимо объявить свой собственный конструктор.
Вы получаете вторую ошибку, потому что компилятору не удалось правильно проанализировать Element
класс, который является родительским классом для Word
. Опять же, вам также придется объявить конструктор для Element
, чтобы Word
класс работал.
Комментарии:
1. Это не просто конструктор копирования (который он не предоставил). Он предоставляет любой конструктор, который предотвращает создание конструктора по умолчанию.
Ответ №3:
Конструкторы не наследуются, поэтому вам нужен конструктор для элемента. Например.,
Element::Element(string f) : Dict(f) { }