проблемы с наследованием и конструкторами

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