Qt:类中变量的默认值

时间:2010-03-21 16:46:43

标签: c++ qt class variables default

在Qt中创建自己的类时,如果我没有将它们设置为任何东西,我希望类中的变量具有标准/默认值。如果可以在h文件中设置这样就完美了,所以我不必在我的类的每个实例方法中都这样做。您可以在下面的代码中看到我想要做的事情。在示例中,myBool的值为false,myInt在创建对象时的值为0。这有可能吗?

在myclass.h中:

class MyClass
{
    Q_OBJECT

public:
MyClass();
   ~MyClass();
    bool myBool = false; //I want to set myBool and myInt to a default/standard value
    int myInt = 0; 
};

3 个答案:

答案 0 :(得分:6)

Qt遵循C ++规则,一条规则是使用构造函数初始化你的成员。

MyClass::MyClass() : myBool(false), myInt(0)
{
}

答案 1 :(得分:5)

不幸的是,您要求的内容在当前的C ++中不可用。在C ++ 0x中你可以这样做,但是现在你可以使用初始化列表:

class MyClass
{
    Q_OBJECT

public:
    MyClass() : myBool(false), myInt(0) { }
   ~MyClass();
    bool myBool;
    int myInt;
};

答案 2 :(得分:2)

我想要我的默认值!

不,当前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”选项编译时,您将没有性能成本。