Russian Qt Forum
Ноябрь 28, 2024, 18:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Статический атрибут класса  (Прочитано 5931 раз)
lokoArt
Гость
« : Февраль 26, 2010, 06:02 »

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

int ClientSqlQueryModel::type =2;

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Февраль 26, 2010, 06:58 »

>>то выдаётся ошибка
а какая ошибка?
Записан

Юра.
voronElf
Гость
« Ответ #2 : Февраль 26, 2010, 07:18 »

запятая нужна после кавычки объявления класса.

ПС: полез копать доки насчет конструкции
Код:
int ClientSqlQueryModel::type =2;
Записан
kramer3d
Гость
« Ответ #3 : Февраль 26, 2010, 08:49 »

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

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

Записан
lokoArt
Гость
« Ответ #4 : Февраль 26, 2010, 10:06 »

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

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



спасибо большое!!! Точка с запятой у меня конено же была))) А вот иниициализацию я производилв заголовочном фале, сейчас попробую в cpp.
Записан
alexman
Гость
« Ответ #5 : Февраль 26, 2010, 10:41 »

Нужно в cpp инициализировать!
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Февраль 26, 2010, 15:34 »

Нужно в cpp инициализировать!

или так

Код
C++ (Qt)
class ClientSqlQueryModel : public QSqlQueryModel{
public:
   static int type = 2;
};
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kramer3d
Гость
« Ответ #7 : Февраль 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.
« Последнее редактирование: Февраль 26, 2010, 17:07 от kramer3d » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Февраль 26, 2010, 20:30 »

Да, безусловно const нужен, недоглядел. Спасибо за поправку

Код
C++ (Qt)
class ClientSqlQueryModel : public QSqlQueryModel{
public:
   static const int type = 2;
};
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
lokoArt
Гость
« Ответ #9 : Февраль 27, 2010, 04:06 »

Спасибо всем. Теперь всё работает)))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.156 секунд. Запросов: 23.