powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не могу определить статическое поле класса
12 сообщений из 12, страница 1 из 1
Не могу определить статическое поле класса
    #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
Не могу определить статическое поле класса
    #39628417
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, вопрос решен!

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

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

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

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


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

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

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

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

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

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

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

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

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


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


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