Russian Qt Forum

Программирование => С/C++ => Тема начата: lokoArt от Февраль 26, 2010, 06:02



Название: Статический атрибут класса
Отправлено: lokoArt от Февраль 26, 2010, 06:02
Добрый день. Пишу на QT и появилась необходимость, создать статический аттрибут в классе
Дело выглядит примерно так:
Код:
class ClientSqlQueryModel : public QSqlQueryModel{
public:
    static int type;
}

int ClientSqlQueryModel::type =2;

Примерно так... А когда компилю, то выдаётся ошибка, причём когда создаются moc файлы... Подскажите пожалуйста почему так происходит?


Название: Re: Статический атрибут класса
Отправлено: lit-uriy от Февраль 26, 2010, 06:58
>>то выдаётся ошибка
а какая ошибка?


Название: Re: Статический атрибут класса
Отправлено: voronElf от Февраль 26, 2010, 07:18
запятая нужна после кавычки объявления класса.

ПС: полез копать доки насчет конструкции
Код:
int ClientSqlQueryModel::type =2;


Название: Re: Статический атрибут класса
Отправлено: kramer3d от Февраль 26, 2010, 08:49
Не зная, что за ошибку выдает компилятор, трудно что-то посоветовать.
Тем не менее, предположу, что это ошибка статической инициализации.
Во-первых, как тут правильно подметил voronElf, после закрывающей скобки нужна точка с запятой (ага, а не запятая).
Если в реальном коде ее нет, получим синтаксическую ошибку, что нибудь типа identifier expected.

Потом, возможно, в реальном коде инициализацию статического члена вы проводите в заголовочном файле. Это неправильно, так как если этот файл включен в несколько компилируемых модулей (читай, cpp-шников), статический член будет проинициализирован несколько раз, и компилятор выдаст ошибку типа
static member ClientSqlQueryModel::type already initialized in там-то и там-то
Статические члены класса должны инициализироваться только один раз, поэтому делать это нужно в самом cpp файле, содержащем реализацию методов этого класса. Хотя можно и в другом файле, но в этом случае есть опасность нарваться на static initialization fiasco (см. C++ FAQ lite), особенно если тип не примитивный и инициализация динамическая. Но главное - что инициализация была в cpp.



Название: Re: Статический атрибут класса
Отправлено: lokoArt от Февраль 26, 2010, 10:06
Не зная, что за ошибку выдает компилятор, трудно что-то посоветовать.
Тем не менее, предположу, что это ошибка статической инициализации.
Во-первых, как тут правильно подметил voronElf, после закрывающей скобки нужна точка с запятой (ага, а не запятая).
Если в реальном коде ее нет, получим синтаксическую ошибку, что нибудь типа identifier expected.

Потом, возможно, в реальном коде инициализацию статического члена вы проводите в заголовочном файле. Это неправильно, так как если этот файл включен в несколько компилируемых модулей (читай, cpp-шников), статический член будет проинициализирован несколько раз, и компилятор выдаст ошибку типа
static member ClientSqlQueryModel::type already initialized in там-то и там-то
Статические члены класса должны инициализироваться только один раз, поэтому делать это нужно в самом cpp файле, содержащем реализацию методов этого класса. Хотя можно и в другом файле, но в этом случае есть опасность нарваться на static initialization fiasco (см. C++ FAQ lite), особенно если тип не примитивный и инициализация динамическая. Но главное - что инициализация была в cpp.



спасибо большое!!! Точка с запятой у меня конено же была))) А вот иниициализацию я производилв заголовочном фале, сейчас попробую в cpp.


Название: Re: Статический атрибут класса
Отправлено: alexman от Февраль 26, 2010, 10:41
Нужно в cpp инициализировать!


Название: Re: Статический атрибут класса
Отправлено: pastor от Февраль 26, 2010, 15:34
Нужно в cpp инициализировать!

или так

Код
C++ (Qt)
class ClientSqlQueryModel : public QSqlQueryModel{
public:
   static int type = 2;
};


Название: Re: Статический атрибут класса
Отправлено: kramer3d от Февраль 26, 2010, 16:24
или так
Код
C++ (Qt)
class ClientSqlQueryModel : public QSqlQueryModel{
public:
   static int type = 2;
};
Не скопмилируется. Хотя, может быть, от компилятора зависит, конечно. Вот если
Код:
   const static int type = 2;
тогда да. :)

UPD: Ан нет. Не зависит. Стандарт 9.4.2.3.


Название: Re: Статический атрибут класса
Отправлено: pastor от Февраль 26, 2010, 20:30
Да, безусловно const нужен, недоглядел. Спасибо за поправку

Код
C++ (Qt)
class ClientSqlQueryModel : public QSqlQueryModel{
public:
   static const int type = 2;
};


Название: Re: Статический атрибут класса
Отправлено: lokoArt от Февраль 27, 2010, 04:06
Спасибо всем. Теперь всё работает)))