【问题标题】:Qt: default value of variable in classQt:类中变量的默认值
【发布时间】:2010-03-21 16:46:43
【问题描述】:

在 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; 
};

【问题讨论】:

  • 您将能够在 C++0x 中做到这一点。

标签: c++ qt class variables default


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我想要我的默认值!

      不,当前的 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 ;
         }
      }
      

      确保包装类的所有代码都内联并包含在包含的头文件中,并且在使用“发布”选项编译时不会产生性能成本。

      【讨论】:

      • 这不值得付出努力,并且(就我的经验而言)没有任何情况下您不能使用构造函数(正如公认的答案所说)。如果我错了,请纠正我...最后,您只是将 Construcor 用法包装到模板类中...
      • @soxs060389:当然,你是对的。但我不愿意提供与其他两人相同的答案。如果你真的真的真的真的需要初始化内置函数(因此,标题“但我真的需要它!!!”),我的解决方案是你将使用的最后一个最终解决方案。
      猜你喜欢
      • 2011-09-22
      • 2011-08-27
      • 1970-01-01
      • 2012-03-30
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      相关资源
      最近更新 更多