Название: Статический атрибут класса Отправлено: lokoArt от Февраль 26, 2010, 06:02 Добрый день. Пишу на QT и появилась необходимость, создать статический аттрибут в классе
Дело выглядит примерно так: Код: class ClientSqlQueryModel : public QSqlQueryModel{ Примерно так... А когда компилю, то выдаётся ошибка, причём когда создаются 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 инициализировать! или так Код
Название: Re: Статический атрибут класса Отправлено: kramer3d от Февраль 26, 2010, 16:24 или так Не скопмилируется. Хотя, может быть, от компилятора зависит, конечно. Вот еслиКод
Код: const static int type = 2; UPD: Ан нет. Не зависит. Стандарт 9.4.2.3. Название: Re: Статический атрибут класса Отправлено: pastor от Февраль 26, 2010, 20:30 Да, безусловно const нужен, недоглядел. Спасибо за поправку
Код
Название: Re: Статический атрибут класса Отправлено: lokoArt от Февраль 27, 2010, 04:06 Спасибо всем. Теперь всё работает)))
|