Я хочу иметь значение по умолчанию!
Нет, в текущем C ++ нет "прямого" способа использовать это поведение по умолчанию для встроенных значений.
Как уже отвечали на два других вопроса, вам нужно будет указать значения в каждом конструкторе MyClass.
Но мне ДЕЙСТВИТЕЛЬНО это нужно !!!
Но если вам действительно это нужно, есть один способ косвенно: встроенный тип в шаблонный класс, перегружающий поддерживаемые операторы.
Таким образом, вы сможете написать следующий код:
void foo()
{
bool b ; // WRONG : Not initialized
Variable<bool> bb ; // Ok : Initialized to false
int i ; // WRONG : Not initialized
Variable<int> ii ; // Ok : Initialized to 0
// etc.
}
Необходимый код, например, для bool:
template<typename T>
class Variable
{
T value_ ;
public :
Variable() ;
Variable(const T & rhs) ;
Variable(const Variable & rhs) ;
Variable & operator = (const T & rhs) ;
Variable & operator = (const Variable & rhs) ;
operator T() const ;
// define all other desired operators here
} ;
А затем, кодирование методов, чтобы иметь желаемое поведение. Например:
template<typename T>
inline Variable<T>::Variable()
: value_(0)
{
}
// For the fun, I want all booleans initialized to true !
template<>
inline Variable<bool>::Variable()
: value_(true)
{
}
// For the fun, I want all doubles initialized to PI !
template<>
inline Variable<double>::Variable()
: value_(3.1415)
{
}
// etc.
template<typename T>
inline Variable<T>::operator T() const
{
return value_ ;
}
// etc.
Список операторов может быть довольно большим, в зависимости от того, что вы хотите сделать с переменной. Например, и целое число будет иметь все арифметические операторы. И все операторы не перегружаются (и не должны быть в этом случае), поэтому у вас не будет всех встроенных поведений.
В любом случае, как видите, вы можете специализировать методы для некоторых типов, если требуется определенное поведение.
Заполнение списка методов и правильное их кодирование - очень хорошее упражнение для C ++.
После этого все, что вам нужно, это объявить вашу переменную:
class MyClass
{
Q_OBJECT
public:
MyClass();
~MyClass();
Variable<bool> myBool ; // it will be set to false, as defined
Variable<int> myInt ; // it will be set to 0, as defined
};
И тогда вы будете использовать его следующим образом:
void foo()
{
MyObject o ;
o.myBool = true ;
if(o.myInt == 0)
{
++o.myInt ;
}
}
Гарантирует, что весь код вашего класса-оболочки встроен и находится во включенных заголовочных файлах, и вы не будете терять производительность при компиляции с опциями "release".