Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Конструкторы

1.8K
30 августа 2005 года
SeregaLBN
62 / / 03.10.2003
Есть некомпилябельный класс ('левый' в качестве примера):
Код:
class CDemo{
   char m_c;
   int  m_i1;
   int  m_i2;
   int &m_li;
public:
   CDemo(int val, char c) : m_i1(val>0 ? 0   :val ),
                            m_i2(val>0 ? val :0   ),
                            m_li(val>0 ? m_i1:m_i2),
                            m_c(c) {}
   CDemo(int val) : CDemo(val, '\0') {}
   CDemo(char c)  : CDemo(0  ,   c ) {}
   CDemo()        : CDemo(0  , '\0') {}
};

Можно как-то его попроще переписать так чтобы он работал?
Мне надо много конструкторов, но просто лень каждый раз писать одну и туже инициализацию членов класса...

Единственное что мне понравилось, так это (компилябельный класс):
Код:
class CDemo{
   char m_c;
   int  m_i1;
   int  m_i2;
   int &m_li;
public:
#define Constructor(val, c)      \
       : m_i1(val>0 ? 0   :val ),\
         m_i2(val>0 ? val :0   ),\
         m_li(val>0 ? m_i1:m_i2),\
         m_c(c) {}
   CDemo(int val, char c) Constructor(val,   c )
   CDemo(int val)         Constructor(val, '\0')
   CDemo(char c)          Constructor(0  ,   c )
   CDemo()                Constructor(0  , '\0')
#undef Constructor
};

Кто-то может предложить что-либо другое?
3
30 августа 2005 года
Green
4.8K / / 20.01.2000
Код:
class CDemo
{
private:
   char m_c;
   int  m_i1;
   int  m_i2;
   int &m_li;

public:
   CDemo(int val=0, char c='\0')
   : m_i1(val>0 ? 0 : val),
     m_i2(val>0 ? val : 0),
     m_li(val>0 ? m_i1, m_i2),
     m_c(c)
   {
   }
};

Либо заведи внутренний метод инициализации и вызывай его из конструктора.
Правда, со ссылкой надо будет отдельно разобраться.
1.8K
30 августа 2005 года
SeregaLBN
62 / / 03.10.2003
Цитата:
Originally posted by Green
Код:
class CDemo
{
private:
   char m_c;
   int  m_i1;
   int  m_i2;
   int &m_li;

public:
   CDemo(int val=0, char c='\0')
   : m_i1(val>0 ? 0 : val),
     m_i2(val>0 ? val : 0),
     m_li(val>0 ? m_i1, m_i2),
     m_c(c)
   {
   }
};

Либо заведи внутренний метод инициализации и вызывай его из конструктора.
Правда, со ссылкой надо будет отдельно разобраться.



Конструкторы по умолчанию это тоже вариант.
Но для того чтобы передавать только второй параметр, нужно писать и первый.

Мне тут подсказали ещё вариант с агрегированием:

Код:
class CDemo{
struct Impl
{
   int  m_i1;
   int  m_i2;
   int &m_li;
   char m_c;
   Impl(int val, char c) : m_i1(val>0 ? 0   :val ),
                            m_i2(val>0 ? val :0   ),
                            m_li(val>0 ? m_i1:m_i2),
                            m_c(c) {;}
} m_Impl;
public:
   CDemo(int val, char c) : m_Impl(val, c) {}
   CDemo(int val) : m_Impl(val, '\0') {}
   CDemo(char c)  : m_Impl(0  ,   c ) {}
   CDemo()        : m_Impl(0  , '\0') {}
   //...
};


Ну и по аналогии я развил вариант с наследованием:
Код:
class CDemoInner{
protected:
   char m_c;
   int  m_i1;
   int  m_i2;
   int &m_li;
   CDemoInner(int val, char c)
       : m_i1(val>0 ? 0   :val),
         m_i2(val>0 ? val :0),
         m_li(val>0 ? m_i1:m_i2),
         m_c(c) {}
};

class CDemo: CDemoInner {
public:
   CDemo(int val, char c) : CDemoInner(val,   c ) {}
   CDemo(int val)         : CDemoInner(val, '\0') {}
   CDemo(char c)          : CDemoInner(0  ,   c ) {}
   CDemo()                : CDemoInner(0  , '\0') {}
};
3
30 августа 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by SeregaLBN

Мне тут подсказали ещё вариант с агрегированием:
<skip>
Ну и по аналогии я развил вариант с наследованием:
<skip>


Концептуально неправильно.
Плодишь сущности без необходимости.
Проще и понятнее написать создание объекта даже указав оба параметра явно, нежели плодить не несущие смысловой нагрузки классы.

1.8K
31 августа 2005 года
SeregaLBN
62 / / 03.10.2003
Цитата:
Originally posted by Green
Концептуально неправильно.
Плодишь сущности без необходимости.
Проще и понятнее написать создание объекта даже указав оба параметра явно, нежели плодить не несущие смысловой нагрузки классы.


Согласен. Поэтому и не использую.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог