Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 9
1

Почему не наследуется конструктор?

18.04.2020, 12:03. Показов 2876. Ответов 5

Author24 — интернет-сервис помощи студентам
У меня проблема заключается в следующем: я сделал учебное задание с одним классом, а оказалось, что нужно было делать еще с двумя производными, которые являются дочерними первого, но теперь, при попытке вызвать конструктор, выдаёт ошибку: "нет подходящей функции с такими аргументами", хотя с классом-родителем всё работало.
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <string>
#include "cl_base.h"
#include "cl_1.h"
#include "cl_2.h"
 
using namespace std;
 
int main()
{
    string root, parent, name;
    cin >> root;
    cl_base* ob_root = new cl_base(0, root);
    cl_2* ob = ob_root;
    cl_2* temp = 0;
    for (int i = 0; ; i++)
    {   
        cin >> parent >> name;
        if (parent == name) 
            break;
        if (i!=0 && ob->get_object_name() != parent)
            ob = temp;
        temp = new cl_2(ob, name);
    }
    cout << ob_root->get_object_name() << endl;
    ob_root->showtree();
    delete ob_root;
    delete temp;
    return 0;
}
cl_base.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef CL_BASE_H
#define CL_BASE_H
 
#include <string>
#include <vector>
using namespace std;
 
class cl_base
{
private:
    string object_name;
    vector <cl_base*> children;
    vector <cl_base*>::iterator it_child;
    cl_base* p_parent;
public:
    cl_base(cl_base* p_parent, string s_object_name);
    cl_base(cl_base* p_parent);
    ~cl_base();
    void set_object_name(string s_object_name);
    string get_object_name();
    void showtree();
};
 
#endif
cl_base.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <string>
#include <vector>
#include "cl_base.h"
 
using namespace std;
 
cl_base::cl_base(cl_base* p_parent, string s_object_name)
{
    set_object_name(s_object_name);
    this->p_parent = p_parent;
    if(this->p_parent != 0)
        this->p_parent->children.push_back(this);
}
 
cl_base::cl_base(cl_base* p_parent)
{
    this->p_parent = p_parent;
}
 
cl_base::~cl_base()
{
    for (int i = 0; i < this->children.size(); i++)
    {
        delete this->children[i];
    }
}
 
void cl_base::set_object_name(string s_object_name)
{
    object_name = s_object_name;
}
 
string cl_base::get_object_name()
{
    return object_name;
}
 
void cl_base::showtree()
{
    cout << this->get_object_name();
    for (int i = 0; i < this->children.size(); i++)
    {
        cout << "  " << this->children[i]->get_object_name();
    }
    for (int i = 0; i < this->children.size(); i++)
    {
        if (this->children[i]->children.size() != 0)
        {
            cout << endl;
            children[i]->showtree();
        }
    }
}
cl_1.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef CL_1_H
#define CL_1_H
 
#include "cl_base.h"
 
class cl_1:public cl_base
{
 
};
 
#endif
cl_2.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef CL_2_H
#define CL_2_H
 
#include "cl_base.h"
 
class cl_2:public cl_base
{
 
};
 
#endif
Текст задачи, если нужно:
Кликните здесь для просмотра всего текста

Для организации иерархического построения объектов необходимо разработать базовый класс, который содержит функционал и свойства для построения иерархии объектов. В последующем, в приложениях использовать этот класс как базовый для всех создаваемых классов. Это позволит включать любой объект в состав дерева иерархии объектов.





Создать базовый класс со следующими элементами:


Свойства:


- наименование объекта (строкового типа);


- указатель на головной объект для текущего объекта (для корневого объекта значение указателя равно 0);


- список указателей на объекты подчиненных к текущему объекту в дереве иерархии.


Функционал:


- параметризированный конструктор с параметром указателя на головной объект в дереве иерархии;


- параметризированный конструктор с параметром указателя на головной объект в дереве иерархии и наименованием объекта;


- метод задания имени объекта;


- метод получения имени объекта;


- метод вывода наименований объектов в дереве иерархии слева направо и сверху вниз.


Написать программу, которая последовательно строит дерево иерархии объектов, слева направо и сверху вниз. Переход на новый уровень происходит от правого (последнего) объекта предыдущего уровня. Для построения дерева использовать объекты двух производных классов, наследуемых от базового. Каждый объект имеет уникальное имя.


Построчно, по уровням вывести наименования объектов построенного иерархического дерева.

Входные данные

Первая строка:
имя корневого объекта
Создается корневой объект.
Вторая строка и последующие строки:
имя головного объекта имя подчиненного объекта
Создается подчиненный объект и добавляется в иерархическое дерево.
Если имя головного объекта равняется имени подчиненного объекта, то новый объект не создается и построение дерева объектов завершается.
Пример ввода
Object_root
Object_root Object_1
Object_root Object_2
Object_root Object_3
Object_3 Object_4
Object_3 Object_5
Object_6 Object_6

Построенное дерево объектов
Object_root
Object_1
Object_2
Object_3
Object_4
Object_5
Выходные данные

Первая строка:
имя корневого объекта
Вторая строка и последующие строки имена головного и подчиненных объектов очередного уровня разделенных двумя пробелами.
имя головного объекта имя подчиненного объекта[[ имя подчиненного объекта] …….]
Пример вывода
Object_root
Object_root Object_1 Object_2 Object_3
Object_3 Object_4 Object_5
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2020, 12:03
Ответы с готовыми решениями:

Не наследуется шаблонный конструктор
Добрый день. Есть такой код:class BaseClass { public: template&lt;typename T&gt; ...

Почему не наследуется?
Создала невиртульную функцию ф в классе а. Затем сделала : public a для класса б, то есть класс б...

Почему конструктор не работает?
Нужна помощь, коллеги, так как сам ничего не понял. Создал класс. Хотелось бы, чтобы при создании...

Почему не работает конструктор?
подскажите почему не инициализируется а4? Почему не происходит неявного вызова конструктора с одним...

5
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,485
Записей в блоге: 1
18.04.2020, 12:14 2
C++
1
2
3
4
5
class cl_1:public cl_base
{
public:
    cl_1(cl_base* p_parent);
};
C++
1
2
3
4
cl_1::cl_1(cl_base* p_parent)
      :cl_base(p_parent, "cl 1") {
  
}
1
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
18.04.2020, 12:27 3
Лучший ответ Сообщение было отмечено Andrestone как решение

Решение

Цитата Сообщение от Andrestone Посмотреть сообщение
Почему не наследуется конструктор?
Конструкторы никогда сами не наследуются.

В "классическом" С++ это было принципиально невозможно.

Начиная с С++11 вы можете сделать

C++
1
2
3
4
class cl_1 : public cl_base
{
   using cl_base::cl_base;
};
то есть явно попросить конструкторы унаследоваться. И они унаследуются.

Цитата Сообщение от Andrestone Посмотреть сообщение
выдаёт ошибку: "нет подходящей функции с такими аргументами"
Вы что-то выдумываете. Ошибка в вашем коде будет в первую очередь здесь

C++
1
2
cl_base* ob_root = new cl_base(0, root);
cl_2* ob = ob_root;
И это совсем другая ошибка. Что это за креатифф?
1
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 9
18.04.2020, 12:32  [ТС] 4
Да, я не знаю, как правильно это оформить, спасибо за пояснение про наследование конструктора. Мне просто обязательно нужно сделать через два производных класса дерево иерархии.

Добавлено через 2 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
cl_base* ob_root = new cl_base(0, root);
а тут вместо cl_base должно быть cl_1
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
18.04.2020, 12:33 5
Цитата Сообщение от Andrestone Посмотреть сообщение
а тут вместо cl_base должно быть cl_1
Это никак не поможет скомпилироваться вашему cl_2* ob = ob_root;.
0
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 9
18.04.2020, 12:39  [ТС] 6
Я понимаю

Добавлено через 5 минут
Может быть у Вас есть идеи, как это можно реализовать? мне просто нужно построить дерево иерархии, задействуя два дочерних класса cl_base? С одним cl_base всё получалось, а тут не знаю, как оформить, буду очень благодарен за помщь
0
18.04.2020, 12:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2020, 12:39
Помогаю со студенческими работами здесь

Почему не работает конструктор?
- Смысл моего вопроса становится ясен из минимального примера приведенного ниже: ...

Почему говорят, что конструктор не наследуется - я сейчас убедился в обратном)
Вот код: mytype = class public a:integer; c:integer; d:string; procedure...

Наследуется ли конструктор базового класса?
Вот такой вопрос по java, что то слышал про слово SUPER это из той оперы ? Можно поподробней ?

почему не наследуется метод из родителького класса
Доброго времени суток. Почему не получается наследовать от класcа user метод getFullName? ...

Почему наследуется значение атрибута из первого блока?
Не понимаю почему &quot;наследуется&quot;(или тут уместен другой термин,я написал по аналогии с принципом...

Можно ли наследовать TPaintBox? И как тогда? А то он почему-то не наследуется
\ uses System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes, ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru