2013-12-03 3 views
0

У меня есть класс, который должен быть только инициализирован определенным образом. Как часть проверки ошибок, у меня есть bool quality, который я хочу иметь значение по умолчанию, равное нулю, если не будет вызван правильный конструктор (который затем проверяет аргументы, чтобы увидеть, правильно ли он был вызван).Переменные по умолчанию в классе с g ++

class CParameters { 
    private: 
     bool quality = 0; 
    //Plus some additional code 
}; 

дает мне

warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default] 
bool quality = 0; 
      ^

В качестве альтернативы:

class CParameters { 
    private: 
     bool quality; 
    public: 
     CParameters; 
}; 

CParameters::CParameters 
{ 
    quality = 0; 
} 

дает мне следующую ошибку:

error: declaraion does not declare anything [-fpermissive] 
CParameters; 
^ 

Alternatively2:

class CParameters { 
    private: 
     bool quality; 
    public: 
     CParameters(); 
     bool good(); 
}; 

CParameters::CParameters() 
{ 
    quality = 0; 
} 

bool CParameters::good() 
{ 
    return quality; 
} 

и затем вызвать его

CParameters CLI; 
CLI.good(); 

дает эту ошибку:

error: request for member 'good' in 'CLI', which is of non-class type 'CParameters()' 

EDIT: Второй вариант является правильным. Причина, по которой CParameters() является неклассовым, заключается в том, что я слишком тупой, чтобы фактически компилировать параметры.cpp при компиляции других файлов.

+4

Обратите внимание на сообщение, которое вы получаете. Это функция C++ 11, которая поддерживается G ++ в режиме C++ 11, поэтому включите режим C++ 11. – hvd

+0

Это будет мое последнее решение, но я помню инициализацию переменных в классах задолго до C++. 11 – medivh

+0

Вы уверены, что то, что вы помните, не инициализирует * статические * переменные в классе? – hvd

ответ

1

Для ваших "альтернативы" вы пропустили некоторые скобки:

class CParameters { 
    private: 
     bool quality; 
    public: 
     CParameters(); 
    //   ^^^ 
}; 

Ошибка говорит:

error: declaraion does not declare anything [-fpermissive] CParameters;

Без скобок это просто тип, который не говорит ничего. С помощью скобок это прототип для конструктора.

Это может иметь смысл, если вы хотите проверить правильный . Конструктор вызывается, чтобы иметь только один правильный конструктор, поэтому компилятор обнаруживает ошибки, вместо того, чтобы проверять их во время выполнения.

.... Edit .... Вы также должны скобки в определении:

CParameters::CParameters() 
//      ^^^^ 
{ 
    quality = 0; 
} 
+0

С круглой скобкой я получаю другую ошибку, см. Обновленное сообщение. EDIT: Когда я его обновил. – medivh

+0

@medivh Ваше изменение не ясно, но теперь я вижу другую ошибку: см. Мое редактирование – doctorlove

+0

Теперь я закончил обновление, показывая другую проблему, с которой я сталкиваюсь, когда включаю скобки – medivh

1

как doctorlove упоминалось, вы пропустили() в конструкторе.

Вы не можете назначать значения по умолчанию в классе. вы можете сделать это только в конструкторе. Если я вас правильно понимаю, что вы хотите что-то вроде:

CParameters::CParameters() : quality(false) 
{ 
//your checking 
quality = true; 
} 

Или иметь свой CTOR бросок, если параметры не правы.

+0

То, что вы говорите, относится к C++ 03, а не к текущему C++. – juanchopanza

+0

Очевидно, что вы правы. Однако, с учетом ошибки: инициализаторы элементов нестатического ввода данных доступны только с -std = C++ 11 или -std = gnu ++ 11 Предполагалось, что он не использует C++ 11 , тем не менее, я должен был упомянуть об этом – yosim

Смежные вопросы