C : для родительского класса не существует конструктора по умолчанию

#c #oop #inheritance

#c #ооп #наследование

Вопрос:

Я пишу файл класса для двоичного дерева поиска (по британскому летнему времени), который простирается от класса (дерево). Тем не менее, я получаю следующую ошибку в моей IDE для текущего файла ( bst.cpp )

введите описание изображения здесь заявляя:

для класса «Дерево» не существует конструктора по умолчанию

При компиляции я получаю следующую ошибку:

нет соответствующей функции для вызова ‘Tree::Tree()’

Это кажется странным, учитывая, что я уже определил конструктор по умолчанию в своей реализации класса дерева и импортировал класс в свой bst.cpp файл:

 // Import dependencies
#include "datastructure.hpp"
#include "tree.cpp"

// Import libraries
#include <fstream>
#include <sstream>

using namespace std;

BST::BST() {
    
}

void BST::solution(const char *input_path, const char *output_path)
{
}
 

Ниже datastructure.hpp :

 #include <iostream>
#include <fstream>
#include <string>
using namespace std;

typedef struct TreeNode { 
   int key;
   int val;
   bool flag;
   int num_children;
   TreeNode **children;
} TreeNode; 

class Tree {
    protected:
        TreeNode* root;
        int max_width;
    public:
        Tree(int width);
        static void solution(const char *input_path, const char *output_path);

};

class BST: public Tree {
    protected:
        int max_width = 2;
        
    public:
        BST();
        static void solution(const char *input_path, const char *output_path);
};
 

И, наконец, ниже приведен мой tree.cpp :

 #include "datastructure.hpp"

#include <fstream>
#include <sstream>
#include <queue> 

using namespace std;

Tree::Tree(int width) {
    max_width = width;
}

void Tree::solution(const char *input_path, const char *output_path)
{
}
 

Комментарии:

1. Как указано, Tree не имеет конструктора по умолчанию. Либо предоставьте его, либо выполните BST() вызов Tree(int) . Конструктор по умолчанию не создается автоматически, если вы его определяете.

2. @karastojko как бы я перевожу оформление по британскому летнему времени (), вызываемой из дерева(инт) в синтаксисе?

3. При звонке по британскому летнему времени(), он автоматически вызывает конструктор базового как дерево (), который не существует.

4. #include "tree.cpp" Это опечатка для #include "tree.hpp" ?

Ответ №1:

Вы получили его там, Tree у него нет конструктора по умолчанию. В результате этого вы не можете сконструировать a по умолчанию BST , потому Tree что то, что находится внутри него, не будет знать, как построить себя.

Вы должны инициализировать его с помощью члена.

 BST::BST() : Tree(1) {}
 

Вы уверены, что не хотите передавать это значение конструктору BST though ?

 BST::BST(int w) : Tree(w) {}