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

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

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

Студворк — интернет-сервис помощи студентам
У меня проблема заключается в следующем: я сделал учебное задание с одним классом, а оказалось, что нужно было делать еще с двумя производными, которые являются дочерними первого, но теперь, при попытке вызвать конструктор, выдаёт ошибку: "нет подходящей функции с такими аргументами", хотя с классом-родителем всё работало.
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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.04.2020, 12:03
Ответы с готовыми решениями:

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

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

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

5
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
18.04.2020, 12:14
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Эксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,209
18.04.2020, 12:27
Лучший ответ Сообщение было отмечено 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  [ТС]
Да, я не знаю, как правильно это оформить, спасибо за пояснение про наследование конструктора. Мне просто обязательно нужно сделать через два производных класса дерево иерархии.

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

Добавлено через 5 минут
Может быть у Вас есть идеи, как это можно реализовать? мне просто нужно построить дерево иерархии, задействуя два дочерних класса cl_base? С одним cl_base всё получалось, а тут не знаю, как оформить, буду очень благодарен за помщь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.04.2020, 12:39
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru