Qt: значение переменной по умолчанию в классе - PullRequest
3 голосов
/ 21 марта 2010

При создании моего собственного класса в 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 ]

6 голосов
/ 21 марта 2010

Qt следует правилам C ++, и одним из правил является использование конструкторов для инициализации ваших членов.

MyClass::MyClass() : myBool(false), myInt(0)
{
}
5 голосов
/ 21 марта 2010

К сожалению, то, что вы просите, недоступно в текущем C ++. В C ++ 0x вы можете сделать это, но сейчас вы можете использовать список инициализатора:

class MyClass
{
    Q_OBJECT

public:
    MyClass() : myBool(false), myInt(0) { }
   ~MyClass();
    bool myBool;
    int myInt;
};
2 голосов
/ 21 марта 2010

Я хочу иметь значение по умолчанию!

Нет, в текущем 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".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...