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
};
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
};
Кто-то может предложить что-либо другое?
Код:
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)
{
}
};
{
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)
{
}
};
Либо заведи внутренний метод инициализации и вызывай его из конструктора.
Правда, со ссылкой надо будет отдельно разобраться.
Цитата:
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)
{
}
};
{
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') {}
//...
};
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') {}
};
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') {}
};
Цитата:
Originally posted by SeregaLBN
Мне тут подсказали ещё вариант с агрегированием:
<skip>
Ну и по аналогии я развил вариант с наследованием:
<skip>
Мне тут подсказали ещё вариант с агрегированием:
<skip>
Ну и по аналогии я развил вариант с наследованием:
<skip>
Концептуально неправильно.
Плодишь сущности без необходимости.
Проще и понятнее написать создание объекта даже указав оба параметра явно, нежели плодить не несущие смысловой нагрузки классы.
Цитата:
Originally posted by Green
Концептуально неправильно.
Плодишь сущности без необходимости.
Проще и понятнее написать создание объекта даже указав оба параметра явно, нежели плодить не несущие смысловой нагрузки классы.
Концептуально неправильно.
Плодишь сущности без необходимости.
Проще и понятнее написать создание объекта даже указав оба параметра явно, нежели плодить не несущие смысловой нагрузки классы.
Согласен. Поэтому и не использую.