Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не могу определить статическое поле класса / 12 сообщений из 12, страница 1 из 1
11.04.2018, 13:15
    #39628359
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу определить статическое поле класса
Создал свой класс со статическим полем. Компилятор написал:
авторundefined reference to 'MyClass::MyVariable'

Попробовал под классом определить статическую переменную:
Код: plaintext
1.
MyClass* MyClass::MyVariable;


и получит такую ошибку:
авторmultiple definition of 'MyClass::MyVariable'

Тогда добавил ключевое слово extern:
Код: plaintext
1.
extern MyClass* MyClass::MyVariable;


и создал cpp- файл:
Код: plaintext
1.
MyClass* MyClass::MyVariable = nullptr;



Получил такую ошибку:
Код: plaintext
1.
2.
redefinition of ‘MyClass* MyClass::MyVariable’
     MyClass* MyClass::MyVariable = nullptr;



Как сделать верно?
...
Рейтинг: 0 / 0
11.04.2018, 14:40
    #39628417
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу определить статическое поле класса
Всем спасибо, вопрос решен!

Надо было только в cpp- файле написать:
Код: plaintext
1.
MyClass* MyClass::MyVariable = nullptr;
...
Рейтинг: 0 / 0
11.04.2018, 14:40
    #39628418
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу определить статическое поле класса
Это лишнее
Код: plaintext
1.
extern MyClass* MyClass::MyVariable;
...
Рейтинг: 0 / 0
11.04.2018, 14:51
    #39628429
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу определить статическое поле класса
AlekseySQL, если ты объявляешь класс в заголовочном файле, член этого класса с префиксом static должен быть объявлен там же - внутри класса. Этот статический член будет один единственный для всех cpp модулей, которые включают этот заголовочный файл. Иными словами, доступ к такому члену из любого cpp модуля будет осуществляться по одному и тому же адресу в памяти (синглет). Никакой extern, при этом, делать не надо, так как cpp модули, включающие заголовочный файл со статическим членом внутри класса, уже знают о нём.

Префикс extern используется только в случае, если тебе надо объявленную в cpp модуле переменную "экспортировать" в другой cpp модуль.

Переменные, объявленные внутри модуля как static экспортировать нельзя - не получится, но если очень хочется, можно экспортировать объявленную в cpp модуле функцию, которая будет возвращать указатель/ссылку на объявленную как static переменную в этом модуле.

Это же азы, ёшки-матрёшки! Как же ты пишешь на C++ не зная всех этих особенностей?
...
Рейтинг: 0 / 0
11.04.2018, 17:48
    #39628642
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу определить статическое поле класса
rdb_devПрефикс extern используется только в случае, если тебе надо объявленную в cpp модуле переменную "экспортировать" в другой cpp модуль.


Наоборот, чтобы "импортировать" из другого модуля.
...
Рейтинг: 0 / 0
11.04.2018, 22:41
    #39628737
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу определить статическое поле класса
rdb_devAlekseySQL, если ты объявляешь класс в заголовочном файле, член этого класса с префиксом static должен быть объявлен там же - внутри класса. Этот статический член будет один единственный для всех cpp модулей, которые включают этот заголовочный файл. Иными словами, доступ к такому члену из любого cpp модуля будет осуществляться по одному и тому же адресу в памяти (синглет). Никакой extern, при этом, делать не надо, так как cpp модули, включающие заголовочный файл со статическим членом внутри класса, уже знают о нём.

Префикс extern используется только в случае, если тебе надо объявленную в cpp модуле переменную "экспортировать" в другой cpp модуль.

Переменные, объявленные внутри модуля как static экспортировать нельзя - не получится, но если очень хочется, можно экспортировать объявленную в cpp модуле функцию, которая будет возвращать указатель/ссылку на объявленную как static переменную в этом модуле.

Это же азы, ёшки-матрёшки! Как же ты пишешь на C++ не зная всех этих особенностей?
Верен только 1й абзац.

В С++ модулей пока еще нет, и не надо путать с единицами компиляции.
...
Рейтинг: 0 / 0
12.04.2018, 05:09
    #39628804
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу определить статическое поле класса
Про шаблоны забыли

Если в шаблоне надо завести статическую переменную, а её нельзя вынести в cpp-файл, то это можно сделать внутри статического метода-геттера.
...
Рейтинг: 0 / 0
12.04.2018, 14:58
    #39629207
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу определить статическое поле класса
SiemarglВ С++ модулей пока еще нет, и не надо путать с единицами компиляции.Считай, что мой "cpp модуль", это твоя "единица компиляции". Так нормально?
...
Рейтинг: 0 / 0
12.04.2018, 15:07
    #39629215
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу определить статическое поле класса
rdb_devSiemarglВ С++ модулей пока еще нет, и не надо путать с единицами компиляции.Считай, что мой "cpp модуль", это твоя "единица компиляции". Так нормально?так правильно. тогда и 3й абзац годится
...
Рейтинг: 0 / 0
12.04.2018, 21:21
    #39629499
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу определить статическое поле класса
SiemarglСчитай, что мой "cpp модуль", это твоя "единица компиляции". Так нормально?так правильно. тогда и 3й абзац годится[/quot]Просто нужно было проникнуться смысловым значением слова "модуль". ;)
...
Рейтинг: 0 / 0
12.04.2018, 22:52
    #39629532
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу определить статическое поле класса
rdb_devSiemarglСчитай, что мой "cpp модуль", это твоя "единица компиляции". Так нормально?так правильно. тогда и 3й абзац годитсяПросто нужно было проникнуться смысловым значением слова "модуль". ;)[/quot]
модули и их нюансы обсуждаются как будущий стандарт С++. механика там поменяется
...
Рейтинг: 0 / 0
13.04.2018, 14:47
    #39629898
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу определить статическое поле класса
Siemarglrdb_devAlekseySQL, если ты объявляешь класс в заголовочном файле, член этого класса с префиксом static должен быть объявлен там же - внутри класса. Этот статический член будет один единственный для всех cpp модулей, которые включают этот заголовочный файл. Иными словами, доступ к такому члену из любого cpp модуля будет осуществляться по одному и тому же адресу в памяти (синглет). Никакой extern, при этом, делать не надо, так как cpp модули, включающие заголовочный файл со статическим членом внутри класса, уже знают о нём.

Префикс extern используется только в случае, если тебе надо объявленную в cpp модуле переменную "экспортировать" в другой cpp модуль.

Переменные, объявленные внутри модуля как static экспортировать нельзя - не получится, но если очень хочется, можно экспортировать объявленную в cpp модуле функцию, которая будет возвращать указатель/ссылку на объявленную как static переменную в этом модуле.

Это же азы, ёшки-матрёшки! Как же ты пишешь на C++ не зная всех этих особенностей?
Верен только 1й абзац.


Почему же? последний и предпоследний абзацы также верны...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не могу определить статическое поле класса / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]