Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 68
#1

Конструктор базового класса - C++

27.06.2014, 04:01. Просмотров 687. Ответов 18
Метки нет (Все метки)

Привет, друзья, есть, к примеру, такие классы:

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
class Base
{
public:
    int x;
    Base()
    {
    }
};
 
class inheritor1 : public Base
{
    inheritor1()
    {
        x=1;
        function1(x);
        function2(x);
        ...
        functionN(x);
    }
};
 
class inheritor2 : public Base
{
    inheritor2()
    {
        x=2;
        function(x);
        function2(x);
        ...
        functionN(x);
    }
};
все функции (function) определены в базовом классе, их очень много, поэтому не хочется прописывать все их вызовы во всех конструкторах дочерних классов, но также нельзя перенести их и в конструктор базового класса, т. к. они могут быть вызваны только после инициализации переменной X, а в каждом дочернем классе она разная. Что можете посоветовать? можно ли сделать так, чтобы только в одном месте нужно было вызывать все эти функции
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2014, 04:01     Конструктор базового класса
Посмотрите здесь:

Конструктор базового класса - C++
Такая проблема: имеется конструктор базового класса ErrorDataErrorData(ErrorCod cod, bool isFatal);, где ErrorCod вот такая...

Не вызывается конструктор базового класса - C++
Доброго времени суток. У меня проблема:в производном классе не вызывается конструктор базового класса. Думаю описывать класс не стоит,...

Не вызывается нужный конструктор базового класса - C++
Здравствуйте. Я пока в процессе изучения С++. Имеется следующая структура классов: Базовый: Person, расширяющие его: Student и...

Функция базового класса - C++
Как вызвать функцию базового класса для объекта производного класса, если в производном классе эта функция была замещена?

Вызов конструктора базового класса - C++
Здравствуйте! Я вот начал изучать C# и немножечко освежил ООП. Но вот у меня вопрос. Я точно помню, что класс-наследник (конструкторы не...

Вызов перегрузки базового класса - C++
Начитавшись c# забыл кое-что по с++, никак теперь не могу вспомнить как вызвать перегрузку базового класса в перегрузке наследника. Есть...

Создание базового класса и наследника - C++
в данной программе , попросили добавить в void main ///camera obj//// и дописать в конструктор camera::camera() сразу вывод через...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
27.06.2014, 04:08     Конструктор базового класса #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Антон219 Посмотреть сообщение
а в каждом дочернем классе она разная.
Почему бы не передавать ее параметром конструктора базового класса. Пытаться "инициализировать"* переменную базового класса из наследника напрямую - плохая идея.
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
class Base
{
public:
    int x;
    Base(int x) : x(x)
    {
        function1(x);
        function2(x);
        ...
        functionN(x);
    }
};
 
class inheritor1 : public Base
{
    inheritor1() : Base(1)
    {
    }
};
 
class inheritor2 : public Base
{
    inheritor2() : Base(2)
    {
    }
};
Avazart
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,388
Записей в блоге: 17
27.06.2014, 04:20     Конструктор базового класса #3
Цитата Сообщение от Антон219 Посмотреть сообщение
public: int x;
Уже тут ошибка, открытых членов класса не должно быть, это плохой тон.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
27.06.2014, 08:40     Конструктор базового класса #4
Может стоит использовать функцию обертку для вызова всех ваших функций?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Base {
    int x;
public:
    Base(int X): x(X)
    {}
    ...
    function_wrapper(int X) {
        function1(X);
        function2(X);
        ...
        functionN(X);    
    }
};
 
class inheritor1 : public Base  {
public:
    inheritor1(int X): Base(X)
    {}
    function_wrapper(x);
};
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.06.2014, 10:07     Конструктор базового класса #5
Цитата Сообщение от Avazart Посмотреть сообщение
Уже тут ошибка, открытых членов класса не должно быть, это плохой тон.
Я думаю, это всего лишь пример, демонстрирующий принадлежность переменной x именно базовому классу. Потому как и функций с именами function1...N быть не должно
Ilot, всё же function_wrapper() имеет смысл сделать protected. Или даже private, если ее вызов может быть перенесен в конструктор Base, как предлагает DrOffset.

Не по теме:

Ilot, и добавлю немного занудства. Надеюсь Вы в реальном коде не используете одновременно переменные с одинаковым именем, но в разных регистрах.

Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
27.06.2014, 10:23     Конструктор базового класса #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Ilot, всё же function_wrapper() имеет смысл сделать protected.
Ну да имелось ввиду как protected. Она же для внутреннего пользования
Добавление функции обертки позволит вызывать данные функции не только при конструировании объекта, но и, например, в присвоении, хотя в этом случае и спецификатор для переменной необходимо менять на protected.
Avazart
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,388
Записей в блоге: 17
27.06.2014, 12:47     Конструктор базового класса #7
В DrOffset примере ф-ции вызываться уже в базовом классе хотя их там нет.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.06.2014, 12:53     Конструктор базового класса #8
Цитата Сообщение от Avazart Посмотреть сообщение
В DrOffset примере ф-ции вызываться уже в базовом классе хотя их там нет.
Но это ведь не значит, что так не должно получиться в итоге Если некоторые действия характерны для всех наследников очевидно перенести их в базовый класс.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
27.06.2014, 16:04     Конструктор базового класса #9
Цитата Сообщение от Avazart Посмотреть сообщение
В DrOffset примере ф-ции вызываться уже в базовом классе хотя их там нет.
Потому что DrOffset прочитал что хочет ТС. Вот же написано в стартовом сообщени:
Цитата Сообщение от Антон219 Посмотреть сообщение
все функции (function) определены в базовом классе, их очень много,
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 68
29.06.2014, 04:51  [ТС]     Конструктор базового класса #10
Да, ребят, функции действительно в базовом классе определены, я забыл это вам прописать, надо было хоть многоточие поставить. DrOffset, да, что-то я не подумал об этом, наверное опыта мало, спасибо!. Ilot, к своему стыду, никогда не слышал о функциях обертки, попробую сделать и так тоже, чтоб разобраться в них, спасибо за пример! Вообще, всем спасибо, что помогаете!))

Добавлено через 30 минут
DrOffset, ты писал:
Цитата Сообщение от DrOffset Посмотреть сообщение
Пытаться "инициализировать"* переменную базового класса из наследника напрямую - плохая идея.
Ты имеешь ввиду, что если переменная объявлена в базовом классе, ее надо инициализировать в конструкторе базового же класса, а в наследных - вызывать конструктор базового в списке инициализации? Это применимо ко всем переменным базовых классов, я имею ввиду - это правила хорошего тона?
Renji
1874 / 1272 / 290
Регистрация: 05.06.2014
Сообщений: 3,630
29.06.2014, 05:02     Конструктор базового класса #11
Это применимо ко всем переменным базовых классов, я имею ввиду - это правила хорошего тона?
Это банально удобнее. Может завтра захочется эту переменную const сделать. А тут опаньки, const можно только через список инициализации инициализировать.
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 68
29.06.2014, 05:27  [ТС]     Конструктор базового класса #12
Понял, Renji, я этого не знал, спасибо
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
29.06.2014, 05:33     Конструктор базового класса #13
Цитата Сообщение от Антон219 Посмотреть сообщение
Это применимо ко всем переменным базовых классов, я имею ввиду - это правила хорошего тона?
Это и правило хорошего тона. И следствие механики языка. Инициализировать переменные базового класса можно только из конструктора базового класса. То что было у тебя - это присваивание. А инициализации вследствие отсутствия ее в конструкторе вообще не было. Поэтому я ее в том посте в кавычках написал.
Avazart
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,388
Записей в блоге: 17
29.06.2014, 14:33     Конструктор базового класса #14
Цитата Сообщение от Tulosba Посмотреть сообщение
Я думаю, это всего лишь пример, демонстрирующий принадлежность переменной x именно базовому классу. Потому как и функций с именами function1...N быть не должно
Оно то пример, но если переменную сделать закрытой, то классы наследники ничего о ней не могу знать, а значит инициализация должна лежать на базовом классе, а не классе наследнике.
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 68
29.06.2014, 21:03  [ТС]     Конструктор базового класса #15
Спасибо, ребят! Теперь так буду делать
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 68
01.07.2014, 19:34  [ТС]     Конструктор базового класса #16
Ребят, скажите, а если такой вариант: да, я вызываю все функции в базовом конструкторе, перед этим инициализируя i в списке инициализации (вызываю конструктор базового в дочернем), но если у меня у наследника1 есть два своих наследника, то я уже не могу в них вызывать конструктор базового(самого первого) класса? Как тогда быть? Множественное наследование? Его вроде не советуют
Renji
1874 / 1272 / 290
Регистрация: 05.06.2014
Сообщений: 3,630
01.07.2014, 19:44     Конструктор базового класса #17
но если у меня у наследника1 есть два своих наследника, то я уже не могу в них вызывать конструктор базового(самого первого) класса? Как тогда быть?
Передавать аргументы по цепочке. Конструктор класса А передает аргумент конструктору предку Б, конструктор предка Б передает аргумент своему предку В, и так пока аргумент не доберется куда надо.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
01.07.2014, 19:56     Конструктор базового класса #18
Антон219,
1. Параметры самых базовых протащить в промежуточный класс
2. сделать так:
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
class Base
{
public:
    Base(int a, int b) : a(a), b(b) {}
    Base(Base const & x) : a(x.a), b(x.b) {}
private:
    int a, b;
};
 
class Derived1 : public Base
{
public:
    Derived1(int a, int b, int c) : Base(a, b), c(c) {} //1
    Derived1(Base const & x, int c) : Base(x), c(c) {}  //2
private:
    int c;    
};
 
class Derived2 : public Derived1
{
public:
    Derived2() : Derived1(1, 2, 3) {} //1
    Derived2() : Derived1(Base(1, 2), 3) {} //2
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2014, 01:15     Конструктор базового класса
Еще ссылки по теме:

Ошибка базового класса строки - C++
Есть код и есть ошибки в mystring.cpp, помогите пожалуйста исправить :help: /*----------------/ mystring.h /---------------*/ ...

Инициализация конструктора базового класса - C++
class animal { public: animal(int a):ianimal(a){} protected: int ianimal; }; class bird:public animal

Конструкторы базового и производного класса - C++
class first { public: first(int a):first(a){} void Setfirst(int a){first=a;} int Getfirst(){return first;} private: ...

Не наследует данные базового класса - C++
Не могу понять что не так,но есть предположение что дело в том что в классе circle поля имеют те же названия что и в базовом. #include...

Наследование конструктора из базового класса - C++
#include "stdafx.h" #include <iostream> #include <cstring> using namespace std; //////////////////// class String { ...


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

Или воспользуйтесь поиском по форуму:
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 68
02.07.2014, 01:15  [ТС]     Конструктор базового класса #19
Да, разобрался, спасибо
Yandex
Объявления
02.07.2014, 01:15     Конструктор базового класса
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru