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

C++

Войти
Регистрация
Восстановить пароль
 
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
#1

Избавление от списка инициализации - C++

04.02.2015, 12:26. Просмотров 391. Ответов 11
Метки нет (Все метки)

На днях написал несколько классов с внушительными конструкторами. Наследовавшие от них классы обязаны вызывать эти конструкторы в списках инициализации. Но мало того, наследующие от этих классов должны ещё в придачу писать конструкторы предыдущих классов. В итоге список инициализации становится внушительных размеров, что дико портит код и затрудняет наследование. Есть идея открыт конструктор по-умолчанию, но тогда будет возможно существование "пустого" объекта и придётся создавать процедуру инициализации. Есть другие методы борьбы с этим?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2015, 12:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Избавление от списка инициализации (C++):

Ошибка при инициализации regex_token_iterator - C++
Объясните почему тут ошибка ? #include <iostream> #include <cstdio> #include <regex> #include <iterator> using namespace...

Циклы for. Проблема объявления/инициализации - C++
Эх, так и придется создавать новую тему. А то, блин, интересно ж... Итак, я тут в недавней теме утверждал, что блок инициализации цикла...

Избавление от повторений значений в таблице StringGrid - C++ Builder
Привет! я выполняю задание связанное с линейными списками и их выводом в табличном виде в StringGrid в билдере Дело в том, что при...

Инициализации ком порта - C++ Builder
Нужно прочитать данные с ком порта, но перед этим его открыть. У нас есть USB RS 485 , при подключении создается какой-то COM порт. Нужно...

Ошибка инициализации и использования функции - C++ Builder
Помогите исправить ошибку инициализации и использования функции! Вбрасываю основную часть кода оптимизации унимодальной функции (метод...

Обнуление структуры в списке инициализации - C++ Builder
Приветствую всех. Есть структура, которая состоит из членов-чисел. При объявлении переменной этой структуры ее члены можно сразу обнулить...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Dmitriy_M
1349 / 1230 / 114
Регистрация: 20.03.2009
Сообщений: 4,421
Записей в блоге: 11
04.02.2015, 12:49 #2
Enno, как это портит код и затрудняет наследование?
0
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
04.02.2015, 13:15  [ТС] #3
Пару минут назад уже сделал процедуры инициализации, дам простой пример.
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
class foo
{
private:
    foo();
protected:
    int a;
    int b;
    int c;
public:
    foo(int _a, int _b, int _c);
};
 
class bar
{
private:
    bar();
protected:
    int a;
    int b;
    int c;
public:
    bar(int _a, int _b, int _c);
};
 
class foobar: virtual public foo, virtual public bar
{
private:
    foobar();
protected:
 
public:
    foobar(int _a, int _b, int _c, int _a1, int _b1, int _c1);
};
 
foobar::foobar(int _a, int _b, int _c, int _a1, int _b1, int _c1):
    foo(_a, _b, _c), bar(_a1, _b1, _c1)
{}
//производный от foobar будет:
class der_fb: public foobar
{
private:
    der_fb();
protected:
 
public:
    der_fb(int _a, int _b, int _c, int _a1, int _b1, int _c1);
};
 
der_fb::der_fb(int _a, int _b, int _c, int _a1, int _b1, int _c1):
    foo(_a, _b, _c), bar(_a1, _b1, _c1), foobar(_a, _b, _c, _a1, _b1, _c1)//В производном классе от der_fb эта дичь дополнится ещё конструктором der_fb.
{}
В итоге раза 4 наследовал и список инициализации занимает 3 строки. Конструктор по-умолчанию вынес в protected, чтобы наследники юзали, а остальные не создавали пустых объектов.
0
Dmitriy_M
1349 / 1230 / 114
Регистрация: 20.03.2009
Сообщений: 4,421
Записей в блоге: 11
04.02.2015, 13:20 #4
Такое количество параметров пример плохого кода(Совершенный код, Макконнелл)
0
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
04.02.2015, 13:25  [ТС] #5
Заметил что при невиртуальном наследовании в список инициализации подобъектов могут входить только прямые базовые классы.

Добавлено через 3 минуты
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Такое количество параметров пример плохого кода
Ты предлагаешь создать структуру? Indirect-версия потом. Необходимость указывать всю линейку базовых классов куда хуже, при любом количестве параметров.
0
hoggy
Нарушитель
6590 / 2771 / 476
Регистрация: 15.11.2014
Сообщений: 6,125
Завершенные тесты: 1
05.02.2015, 02:50 #6
Цитата Сообщение от Enno Посмотреть сообщение
Ты предлагаешь создать структуру?
я бы изменил дизайн таким образом, что бы отпала сама необходимость в большом,
тем паче плохо контролируемом количестве аргументов.

Цитата Сообщение от Enno Посмотреть сообщение
Необходимость указывать всю линейку базовых классов куда хуже, при любом количестве параметров.
В таком случае есть смысл подумать, как можно изменить саму архитектуру классов так, что бы в принципе не возникала такая необходимость.

Устранять нужно причины проблемы, а не её последствия.
0
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
05.02.2015, 13:47  [ТС] #7
Цитата Сообщение от hoggy Посмотреть сообщение
я бы изменил дизайн таким образом, что бы отпала сама необходимость в большом,
тем паче плохо контролируемом количестве аргументов.
Как ты прямоугольник задашь меньше чем в 4 значения?
0
IrineK
Заблокирован
05.02.2015, 14:12 #8
Цитата Сообщение от Enno Посмотреть сообщение
Как ты прямоугольник задашь меньше чем в 4 значения?
Если мы о геометрии, то логично взять готовый/разработать свой класс Point.
Тогда прямоугольник определяется двумя точками.
0
hoggy
Нарушитель
6590 / 2771 / 476
Регистрация: 15.11.2014
Сообщений: 6,125
Завершенные тесты: 1
05.02.2015, 17:06 #9
Цитата Сообщение от Enno Посмотреть сообщение
Сообщение от hoggy
я бы изменил дизайн таким образом, что бы отпала сама необходимость в большом,
тем паче плохо контролируемом количестве аргументов.
Как ты прямоугольник задашь меньше чем в 4 значения?
В моем сообщении нет ни намека ни на какие прямоугольники.

Прямоугольник то как раз удобно задавать 4мя значениями.
Ну или двумя, если эти значения - объекты-точки.

Суть то не в этом. А в том, что дизайн должен быть так устроен,
что бы не возникало потребности передавать в конструкторе все 100500 возможных аргумента,
для всех 100500 возможных компонентов,
из которых может состоять класс с которым работает пользователь.
---------------------------

Пример дизайна использования класса "произвольной фигуры":


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
int main
{
 
    // 2-х мерная фигура описывается произвольным количеством точек
    // Close в самом конце означает, 
    // что фигуру нужно замкнуть - соединить первую точку с последней
    Figure figure("какая то фигурка")
        (10,20)(30,40)(-5,-10)(7,7)(2,3)(6,7)(12,1)(1,12)(-10,-10).Close();
 
    //для удобства формирования типичных фигур, 
    //можно использовать заранее заготовленные функции:
 
    figure = Make<Rect>(10,10,20,20);
    figure = Make<Circle>(10,10,20);
 
   //и тд и тп
 
}
Дизайн получается лаконичный, компактный.
Он легко расширяется и не требует на каждый чих порождать все больше и большее количество классов, увеличивать глубину наследования,
и уж тем более передавать неимоверную кучу разных аргументов.
0
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
05.02.2015, 19:14  [ТС] #10
Цитата Сообщение от IrineK Посмотреть сообщение
Тогда прямоугольник определяется двумя точками.
Но тогда придётся перед вызовом функции объявлять и заполнять структуру. Шило на мыло.
Цитата Сообщение от hoggy Посмотреть сообщение
для всех 100500 возможных компонентов
Оуу, там далеко не все. Только самые необходимые.
В общем делаю я мини-окна в консоли для разной фигни, и как в WinAPI функция создания окна дюже большая. Банально угол один, угол другой, размер буфера, имя, тип. Вот уже 7 параметров. Если учитывать что некоторые операции можно безболезненно проделать только на начальном этапе, то конструктор просто обязан включать некоторые параметры.
0
hoggy
Нарушитель
6590 / 2771 / 476
Регистрация: 15.11.2014
Сообщений: 6,125
Завершенные тесты: 1
05.02.2015, 20:03 #11
Цитата Сообщение от Enno Посмотреть сообщение
В общем делаю я мини-окна в консоли для разной фигни,
Для чего то gui-подобного можно использовать дизайн "формочек".

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
auto form = 
  Form::create("form")
    .size(10,10)
    .position(100,100)
    .title("Form")   
    .widget<Box>("box1")
      .size(10,10)
      .position(100,100)
      .widget<Label>("label1")
        .size(10,10)
        .position(100,100)
        .text("this is label")
      .init()
    .init()
    .widget<Box>("box2")
      .size(10,10)
      .position(100,100)
    .init()
  .show();
Каждый компонент, который вы размещаете на форме - это так называемый виджет.
Виджетов может быть множество самых разных.
Конкретные виджеты могут иметь какие угодно уникальные параметры-настройки.

Виджеты можно вставлять друг в дружку.

--------------------------------------------------------
С технической точки зрения форма - это граф,
который содержит элементы разного типа данных.
2
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
06.02.2015, 04:44  [ТС] #12
Суть в том что Я ДЕЛАЮ, а не Я ИСПОЛЬЗУЮ. Также мне непонятен синтаксис. Там возврат почти каждого метода это ссылка типа *this?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2015, 04:44
Привет! Вот еще темы с ответами:

Rich-блок: избавление - Visual C++
Нашёл на днях статейку про rich-блок, запихиваемый VS в каждый .exe. http://stoned-vienna.com/html/index.php?page=microsofts-rich-header...

Избавление от заголовков ответа сервера - Visual C++
здравствуйте, у меня есть функция получения данных по url: static char* OpenURL(char *url) { WSADATA lpWSAData; SOCKET s; ...

Принцип работы списка инициализации членов класса - C++
Доброго дня! Интересует принцип работы списка инициализации членов класса. Предположим, есть следующее описание класса: class A...

Заполнение списка инициализации для трёхмерного массива - C++
Здравствуйте как правильно инициализировать и заполнить статический трёх мерный массив? с двух мерным всё ясно и просто int...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.02.2015, 04:44
Ответ Создать тему
Опции темы

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