183 / 175 / 57
Регистрация: 25.09.2014
Сообщений: 828
1

Возврат статической переменной

09.08.2016, 17:42. Показов 929. Ответов 5
Метки нет (Все метки)

Добрый день.

Вот этот код в QtCreator работал исправно:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[B]Class1.h[/B]
class Class1::public QObject
{
public:
static int metatype_id;
 
Class1();
Class1(const Class1 &copy);
~Class1();
 
static int getMetaTypeID() { return metatype_id; }
};
Q_DECLARE_METATYPE(Class1)
 
[B]Class1.cpp[/B]
static int metatype_id = qRegisterMetaType<Class1>("Class1");
 
Class1::Class1(){...}
Class1::Class1(const Class1 &copy){...}
Class1::~Class1(){}
В другом классе при вызове
C++ (Qt)
1
2
Class1 *test = new Class1();
qDebug() << test->getMetaTypeID();
Выводит ID корректно.


С недавних пор использую Qt из под Visual Studio. Этот же код выдаст 2 ошибки:
C++ (Qt)
1
2
3
Error   8   error LNK2001: unresolved external symbol "public: static int Class1::metatype_id" (?metatype_id@Class1@@2HA)
и
Error   9   error LNK1120: 1 unresolved externals
После 30 минут тыканий вслепую, убедился, что ошибка не происходит, если в реализации класса Class1 мы меняем строку
C++ (Qt)
1
static int metatype_id = qRegisterMetaType<Class1>("Class1");
на
C++ (Qt)
1
int Class1::metatype_id = qRegisterMetaType<Class1>("Class1");
Теперь вопрос - это я чего-то не понимаю и QtCreator легче переносил корявый код, чем студия или это студия глючит?
И вообще, чем эти 2 строки отличаются?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2016, 17:42
Ответы с готовыми решениями:

Инициализация статической переменной через QLineEdit
Всем привет. Собственно интересует следующее: color = ui-&gt;WaterColor-&gt;text(); В хедер...

Проблема с взаимодействием динамической и статической памяти - обращение к статической переменной
Здравствуйте! Помогите решить проблему! Задача такая: написать сортировку бинарным деревом, так...

Объявление статической переменной и статической функции в классе
Добрый вечер, столкнулся с проблемой и не могу решить. Есть класс SavingsAccount и в нем объявлена...

Проблемы со статической переменной.
Здравствуйте.По видемому простой вопрос,но не где не могу найти ответа. Есть счетчик на...

5
Заблокирован
09.08.2016, 18:30 2
Лучший ответ Сообщение было отмечено Горбаг как решение

Решение

Цитата Сообщение от Горбаг Посмотреть сообщение
Теперь вопрос - это я чего-то не понимаю
Не понимаешь инициализацию статических переменных. Погугли как это правильно делать. Студия тебе всё правильно говорит и так и надо делать как в студии.
1
183 / 175 / 57
Регистрация: 25.09.2014
Сообщений: 828
09.08.2016, 20:42  [ТС] 3
Это я уже сам понял =) Другое дело, что в креаторе такое работало =)
0
Заблокирован
09.08.2016, 20:56 4
Цитата Сообщение от Горбаг Посмотреть сообщение
Другое дело, что в креаторе такое работало =)
Разные компиляторы были наверное...
Цитата Сообщение от Горбаг Посмотреть сообщение
static int metatype_id = qRegisterMetaType<Class1>("Class1");
Этой штукой, которая у тебя работала, ты просто объявляешь глобальную статическую переменную в CPP файле, для этого её в H не надо объявлять. По этому, компилятор студии увидел, что у тебя есть какая - то статическая переменная в CPP, ну и хрен бы с ней, но в тоже время у тебя есть статическая переменная в H, для которой нет определения, вот и ругался ))
1
183 / 175 / 57
Регистрация: 25.09.2014
Сообщений: 828
10.08.2016, 09:13  [ТС] 5
Да, спасибо, это я понял. В креаторе раз на автомате написал и так и пошло без раздумий. А вон оно, как все оказалось.
0
12 / 9 / 1
Регистрация: 08.08.2016
Сообщений: 45
10.08.2016, 11:21 6
Я бы посоветовал сделать эту переменную private , а не public и инициализировал ее при создании первого объекта.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.08.2016, 11:21

Наследование статической переменной
есть класс с статистическим полем я от него &quot;произвожу&quot; два потомка. у всех этик классов будет...

Обращение к статической переменной
Уточните пожалуйста как обратиться к статик переменной ,если её название содержится например в...

Объявление статической переменной
в наследнике класса Thread в модуле h объявляю private static int iLink. Компилится нормально....

Ошибка в объявлении статической переменной
Знакомлюсь со статическими переменными в ООП, первая программа, ошибки в строке 6 . Как исправить?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.