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

C++

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

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

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

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

Инициализация не агрегированных данных списка инициализации не допускается - C++
Подскажите как исправить эту ошибку #include "stdafx.h" #include "iostream" using namespace std; struct Point { double...

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

Избавление от структуры - C++
Всем привет. Имеется задачка выполненная с использованием классов. Вводится ограничения по возрасту и из данного введенного промежутка...

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; ...

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

Списки инициализации - C++
Подскажите пожалуйста, как составить список инициализации для конструктра следующего класса? class Droid{ public: ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmitriy_M
1340 / 1221 / 111
Регистрация: 20.03.2009
Сообщений: 4,375
Записей в блоге: 11
04.02.2015, 12:49     Избавление от списка инициализации #2
Enno, как это портит код и затрудняет наследование?
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, чтобы наследники юзали, а остальные не создавали пустых объектов.
Dmitriy_M
1340 / 1221 / 111
Регистрация: 20.03.2009
Сообщений: 4,375
Записей в блоге: 11
04.02.2015, 13:20     Избавление от списка инициализации #4
Такое количество параметров пример плохого кода(Совершенный код, Макконнелл)
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
04.02.2015, 13:25  [ТС]     Избавление от списка инициализации #5
Заметил что при невиртуальном наследовании в список инициализации подобъектов могут входить только прямые базовые классы.

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

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

Устранять нужно причины проблемы, а не её последствия.
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
05.02.2015, 13:47  [ТС]     Избавление от списка инициализации #7
Цитата Сообщение от hoggy Посмотреть сообщение
я бы изменил дизайн таким образом, что бы отпала сама необходимость в большом,
тем паче плохо контролируемом количестве аргументов.
Как ты прямоугольник задашь меньше чем в 4 значения?
IrineK
Заблокирован
05.02.2015, 14:12     Избавление от списка инициализации #8
Цитата Сообщение от Enno Посмотреть сообщение
Как ты прямоугольник задашь меньше чем в 4 значения?
Если мы о геометрии, то логично взять готовый/разработать свой класс Point.
Тогда прямоугольник определяется двумя точками.
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,722
Завершенные тесты: 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);
 
   //и тд и тп
 
}
Дизайн получается лаконичный, компактный.
Он легко расширяется и не требует на каждый чих порождать все больше и большее количество классов, увеличивать глубину наследования,
и уж тем более передавать неимоверную кучу разных аргументов.
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
05.02.2015, 19:14  [ТС]     Избавление от списка инициализации #10
Цитата Сообщение от IrineK Посмотреть сообщение
Тогда прямоугольник определяется двумя точками.
Но тогда придётся перед вызовом функции объявлять и заполнять структуру. Шило на мыло.
Цитата Сообщение от hoggy Посмотреть сообщение
для всех 100500 возможных компонентов
Оуу, там далеко не все. Только самые необходимые.
В общем делаю я мини-окна в консоли для разной фигни, и как в WinAPI функция создания окна дюже большая. Банально угол один, угол другой, размер буфера, имя, тип. Вот уже 7 параметров. Если учитывать что некоторые операции можно безболезненно проделать только на начальном этапе, то конструктор просто обязан включать некоторые параметры.
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,722
Завершенные тесты: 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();
Каждый компонент, который вы размещаете на форме - это так называемый виджет.
Виджетов может быть множество самых разных.
Конкретные виджеты могут иметь какие угодно уникальные параметры-настройки.

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

--------------------------------------------------------
С технической точки зрения форма - это граф,
который содержит элементы разного типа данных.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2015, 04:44     Избавление от списка инициализации
Еще ссылки по теме:

Ошибка инициализации - C++
Доброго времени суток! У меня такая проблема, создал небольшой проект в windows forms, ну мой первый калькулятор, фактически это мое первое...

Ошибка инициализации - C++
При такой инициализации вылезают ошибки: error C2064: term does not evaluate to a function taking 7 arguments IntelliSense: call of...

файл инициализации - C++
подскажите как можно в программе записать функцию GetPrivateProfileInt нашел синтаксис UINT WINAPI GetPrivateProfileInt( _In_ ...

Конструктор инициализации - C++
Как передать параметры конструктору, если объект класса определен как указатель? #include &lt;iostream&gt; using namespace...

Ошибка инициализации - C++
Помогите пожалуйста исправить ошибку в этой программе #include &lt;iostream&gt; using namespace std; #include &lt;cstring&gt; class ZOO ...


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

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

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