Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

27.06.2014, 04:01. Просмотров 734. Ответов 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, а в каждом дочернем классе она разная. Что можете посоветовать? можно ли сделать так, чтобы только в одном месте нужно было вызывать все эти функции
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2014, 04:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор базового класса (C++):

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

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

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

Конструктор класса не видит конструктор по умолчанию другого класса - C++
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

Вызов метода производного класса через обращение к методу базового класса - C++
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Перегрузка оператора >> для дочернего класса от базового виртуального класса - C++
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на поиск ответа в глубинах учебников,...

18
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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)
    {
    }
};
1
Avazart
Эксперт С++
7235 / 5431 / 303
Регистрация: 10.12.2010
Сообщений: 24,135
Записей в блоге: 17
27.06.2014, 04:20 #3
Цитата Сообщение от Антон219 Посмотреть сообщение
public: int x;
Уже тут ошибка, открытых членов класса не должно быть, это плохой тон.
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 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);
};
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.06.2014, 10:07 #5
Цитата Сообщение от Avazart Посмотреть сообщение
Уже тут ошибка, открытых членов класса не должно быть, это плохой тон.
Я думаю, это всего лишь пример, демонстрирующий принадлежность переменной x именно базовому классу. Потому как и функций с именами function1...N быть не должно
Ilot, всё же function_wrapper() имеет смысл сделать protected. Или даже private, если ее вызов может быть перенесен в конструктор Base, как предлагает DrOffset.

Не по теме:

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

2
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
27.06.2014, 10:23 #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Ilot, всё же function_wrapper() имеет смысл сделать protected.
Ну да имелось ввиду как protected. Она же для внутреннего пользования
Добавление функции обертки позволит вызывать данные функции не только при конструировании объекта, но и, например, в присвоении, хотя в этом случае и спецификатор для переменной необходимо менять на protected.
1
Avazart
Эксперт С++
7235 / 5431 / 303
Регистрация: 10.12.2010
Сообщений: 24,135
Записей в блоге: 17
27.06.2014, 12:47 #7
В DrOffset примере ф-ции вызываться уже в базовом классе хотя их там нет.
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.06.2014, 12:53 #8
Цитата Сообщение от Avazart Посмотреть сообщение
В DrOffset примере ф-ции вызываться уже в базовом классе хотя их там нет.
Но это ведь не значит, что так не должно получиться в итоге Если некоторые действия характерны для всех наследников очевидно перенести их в базовый класс.
1
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
27.06.2014, 16:04 #9
Цитата Сообщение от Avazart Посмотреть сообщение
В DrOffset примере ф-ции вызываться уже в базовом классе хотя их там нет.
Потому что DrOffset прочитал что хочет ТС. Вот же написано в стартовом сообщени:
Цитата Сообщение от Антон219 Посмотреть сообщение
все функции (function) определены в базовом классе, их очень много,
1
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 71
29.06.2014, 04:51  [ТС] #10
Да, ребят, функции действительно в базовом классе определены, я забыл это вам прописать, надо было хоть многоточие поставить. DrOffset, да, что-то я не подумал об этом, наверное опыта мало, спасибо!. Ilot, к своему стыду, никогда не слышал о функциях обертки, попробую сделать и так тоже, чтоб разобраться в них, спасибо за пример! Вообще, всем спасибо, что помогаете!))

Добавлено через 30 минут
DrOffset, ты писал:
Цитата Сообщение от DrOffset Посмотреть сообщение
Пытаться "инициализировать"* переменную базового класса из наследника напрямую - плохая идея.
Ты имеешь ввиду, что если переменная объявлена в базовом классе, ее надо инициализировать в конструкторе базового же класса, а в наследных - вызывать конструктор базового в списке инициализации? Это применимо ко всем переменным базовых классов, я имею ввиду - это правила хорошего тона?
0
Renji
2015 / 1383 / 312
Регистрация: 05.06.2014
Сообщений: 3,947
29.06.2014, 05:02 #11
Это применимо ко всем переменным базовых классов, я имею ввиду - это правила хорошего тона?
Это банально удобнее. Может завтра захочется эту переменную const сделать. А тут опаньки, const можно только через список инициализации инициализировать.
1
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 71
29.06.2014, 05:27  [ТС] #12
Понял, Renji, я этого не знал, спасибо
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
29.06.2014, 05:33 #13
Цитата Сообщение от Антон219 Посмотреть сообщение
Это применимо ко всем переменным базовых классов, я имею ввиду - это правила хорошего тона?
Это и правило хорошего тона. И следствие механики языка. Инициализировать переменные базового класса можно только из конструктора базового класса. То что было у тебя - это присваивание. А инициализации вследствие отсутствия ее в конструкторе вообще не было. Поэтому я ее в том посте в кавычках написал.
1
Avazart
Эксперт С++
7235 / 5431 / 303
Регистрация: 10.12.2010
Сообщений: 24,135
Записей в блоге: 17
29.06.2014, 14:33 #14
Цитата Сообщение от Tulosba Посмотреть сообщение
Я думаю, это всего лишь пример, демонстрирующий принадлежность переменной x именно базовому классу. Потому как и функций с именами function1...N быть не должно
Оно то пример, но если переменную сделать закрытой, то классы наследники ничего о ней не могу знать, а значит инициализация должна лежать на базовом классе, а не классе наследнике.
1
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 71
29.06.2014, 21:03  [ТС] #15
Спасибо, ребят! Теперь так буду делать
0
29.06.2014, 21:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2014, 21:03
Привет! Вот еще темы с ответами:

Создание указателя типа базового класса на экземпляр производного класса - C++
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса - наследника, для чего это может применяться?

Указатель на объект базового класса и адрес объекта производного класса - C++
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса - C++
Класс В является производным от класса А. Определить обработчик исключительной ситуации на преобразование указателя базового класса А на...

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса - C++
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей на базовый абстрактный класс,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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