Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/42: Рейтинг темы: голосов - 42, средняя оценка - 4.60
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510

Статический класс

25.04.2024, 04:02. Показов 10185. Ответов 165
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет
хочу создать полностью статический класс и создаю
но возникают ошибки неопределенные reference и пр.

хотелось бы сделать так
C#
1
2
3
4
5
6
7
static class SomeClass{
 
 
public int var1{}, var2{}, var3{};
......
 
}
но в с++ ругается на static перед словом класс
пишу в итоге так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class SomeClass{
 
SomeClass(){};
public:
 
static float var1{}, var2{}, varN{}; 
static float somethingMethod(){
//тут использую переменные var1, var2....
};
 
//static float var1{}, var2{}, varN{}; // без разницы   где объявляю переменные выше или ниже метода,  ругается не необъявленные переменные
 
 
 
}
 
 
//
 
вызываю так 
SomeClass::somethingMethod();

при компиляции получаю ошибки
необъявленные ссылки на var1, var2 ....

undefined reference to `SomeClass::var1


вопрос
как объявить статический метод класса, а в идеале и вообще весь класс, чтобы не создавать в коде его экземпляр?

Добавлено через 4 минуты
основная задача вынести этот статический класс в один файл то бишь в модуль не хедер + cpp а сразу все
в одном как в шарпах - очень удобно это они придумали в шарпах
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2024, 04:02
Ответы с готовыми решениями:

Дан класс, преобразуйте его в статический класс со статическими методами и продемонстрируйте работу с ним
Дан класс, преобразуйте его в статический класс со статическими методами и продемонстрируйте работу с ним.

Статический класс
Здравствуйте, а я правильно понимаю что статический класс - это класс у которого все методы статические? Добавлено через 57 секунд ...

Статический член указатель на класс
Доброго времени суток. Что требовалось: создать статический указатель на класс CPerson, чтобы сохранить в него нужный объект. Как пытался...

165
фрилансер
 Аватар для Алексей1153
6461 / 5667 / 1130
Регистрация: 11.10.2019
Сообщений: 15,083
13.05.2024, 14:52
Студворк — интернет-сервис помощи студентам
pup_kin, у статических объектов инициализация есть всегда, её невозможно забыть
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
13.05.2024, 15:03  [ТС]
но сейчас возникает куча вопросов по реализации стандарта
"Variables with static storage duration (3.7.1) or thread storage duration (3.7.2) shall be zero-initialized (8.5) before any other initialization takes place."

это же для компилятора указание?
программист же не будет сначала устанавливать в ноль , а потом в другое значение.
он сразу полагает что там ноль, и ставит другое значение,
но тогда вопрос - почему нельзя оставить ноль и не требовать динамической инициализации.


Together, zero-initialization and constant initialization are called static initialization; all other initialization is dynamic initialization. Static initialization shall be performed before any dynamic initialization takes place. <...>
почему нельзя было сделать нулевую - как они сделали, и сразу ее в константную.

ну просто так получилось

Добавлено через 2 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
pup_kin, у статических объектов инициализация есть всегда, её невозможно забыть
вот, именно я и пишу про это пост
почему бы не пойти дальше и не упростить жизнь, добавив еще одну инициализацию по умолчанию.

какой мне хрен с этой нулевой инициализации - если undefined reference.

Т.е. просто так написано, исторически.
можно академически развести демагогию, но понимать здесь нечего - реализовано как реализовано.

я напрмиемр не вижу проблем чтобы сразу дать значение по умолчанию и не требовать явной или какой-то там динамической инициализации.

Добавлено через 2 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
pup_kin, у статических объектов инициализация есть всегда, её невозможно забыть
ха, я как раз таки и думал что статическая переменная уже инициализирована значением по умолчанию )))
вот в чем казус то)
и обращался к ней в методе, не инициализировав дополнительно вручную.

Добавлено через 2 минуты
потому что это логично - она на то и статическая чтобы быть инициализированной сразу.
в этом её и суть.


но оказалось всё круче,
оказалось можно одну статику инициализировать другой статикой.
чего невозможно было бы реализовать если разрешить инициализировать статику внутри объявления класса.


может именно поэтому
0
фрилансер
 Аватар для Алексей1153
6461 / 5667 / 1130
Регистрация: 11.10.2019
Сообщений: 15,083
13.05.2024, 15:03
Цитата Сообщение от pup_kin Посмотреть сообщение
undefined reference
без определения и инициализации быть не может

короче, едем по кругу, я чувствую
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
13.05.2024, 15:09  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
короче, едем по кругу, я чувствую
стоп
а где в
C++
1
2
3
class A{
static int a;
};
Определение A::a?

определения здесь нет, но вы пишете что переменная статическая всегда имеет инициализацию?

вопрос где в коде
C++
1
2
3
class A{
static int a;
};
A::a - имеет инициализацию?

Добавлено через 56 секунд
она ее здесь не имеет - потому что это объявление
значит не всегда.
но согласно стандарту - она ее будет иметь при компиляции
в значение по умолчанию.

но сейчас она ее не имеет
0
фрилансер
 Аватар для Алексей1153
6461 / 5667 / 1130
Регистрация: 11.10.2019
Сообщений: 15,083
13.05.2024, 15:10
pup_kin, смотри.

1) в коде могут быть объявления. Сколько угодно. Компилятору фиолетово.

Если этими объектами никто не воспользовался, то ничего страшного не произошло. Наверное, даже линкер их проигнорирует

(на данном этапе инициализации ещё не может быть, поскольку объекты только "на бумажке")

2) в коде могут быть определения или объявления сразу с определениями

(тут для статических объектов нулевая принудительная инициализация либо указанная программистом. Для остальных объектов может не быть инициализации)

Цитата Сообщение от pup_kin Посмотреть сообщение
class A{
static int a;
};
здесь нет определения
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
13.05.2024, 15:11  [ТС]
я так понял, вся этат баблалайцйка со статикой началась для того, чтобы можно было инициализировать одну статику другой статикой не особо заморачиваясь на порядок инклюдов.

Добавлено через 49 секунд
Цитата Сообщение от Алексей1153 Посмотреть сообщение
десь нет определения
конечно нет.
и инициализации здесь нет
значит не всегда она инициализирована, или всегда значит не всегда ?
предлагаю забить,
написано достаточно
0
фрилансер
 Аватар для Алексей1153
6461 / 5667 / 1130
Регистрация: 11.10.2019
Сообщений: 15,083
13.05.2024, 15:12
pup_kin, конечно же инициализация у статических объектов есть всегда
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
13.05.2024, 15:12  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
(тут для статических объектов нулевая принудительная инициализация либо указанная программистом. Для остальных объектов может не быть инициализации)
вопрос если произошла нулевая статическая инициализация - означает ли это что сущностью можно пользоваться ?
0
фрилансер
 Аватар для Алексей1153
6461 / 5667 / 1130
Регистрация: 11.10.2019
Сообщений: 15,083
13.05.2024, 15:13
Цитата Сообщение от pup_kin Посмотреть сообщение
если произошла нулевая статическая инициализация - означает ли это что сущностью можно пользоваться
инициализированный объект можно читать
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
13.05.2024, 15:15  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
pup_kin, конечно же инициализация у статических объектов есть всегда
а где она здесь
и в чем она выражается?
C++
1
2
3
class A{
static int a;
};
и я далее пишу
C++
1
cout << "show me your initialization "<<A::a;
и что будет?

Добавлено через 35 секунд
Цитата Сообщение от Алексей1153 Посмотреть сообщение
инициализированный объект можно читать
а вроде ругается ubdefined reference
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
13.05.2024, 15:15
pup_kin
По-моему, вы не различаете 3 разных понятия:

- объявление статического члена класса
- определение статического члена класса
-инициализация статического члена класса

Это три разные части синтаксиса.
И важно, что их именно 3, а не 2.
1
фрилансер
 Аватар для Алексей1153
6461 / 5667 / 1130
Регистрация: 11.10.2019
Сообщений: 15,083
13.05.2024, 15:16
Цитата Сообщение от pup_kin Посмотреть сообщение
а где она здесь
и в чем она выражается?
C++Выделить код
1
2
3
class A{
static int a;
};
здесь нет определения, поэтому инициализации ещё нет

Цитата Сообщение от pup_kin Посмотреть сообщение
а вроде ругается ubdefined reference
правильно пишет, я его поддерживаю
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
13.05.2024, 15:16
И вообще
не почитать ли матчасть
https://habr.com/ru/articles/527044/
Чтобы хотя бы в терминах не плавать
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
13.05.2024, 15:18  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Это три разные части синтаксиса.
И важно, что их именно 3, а не 2.
я почему то был уверен что их два понятия )

Добавлено через 12 секунд
объявление и определение

Добавлено через 24 секунды
чета от меня ускользнула какая-то важная деталь.
надо осмыслить
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
13.05.2024, 15:18
Цитата Сообщение от pup_kin Посмотреть сообщение
я почему то был уверен что их два понятия
Вот, я так и понял, что вы всего 2 из них видели.
А их 3.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
13.05.2024, 15:22  [ТС]
а в чем отличие для переменной/ поля определения от инициализации?

Добавлено через 1 минуту
если инициализацией называется процесс присваивания значения переменной/полю согласно определению в процессе компиляции, то это казуистика как по мне.
0
фрилансер
 Аватар для Алексей1153
6461 / 5667 / 1130
Регистрация: 11.10.2019
Сообщений: 15,083
13.05.2024, 15:27
pup_kin,объявление - это способ сказать, что где-то объект был "физически" построен. Линкер найдёт потом после компиляции, где именно. И все упоминания привяжет туда

определение - это способ сказать, где "физически" будет находиться в коде объект (образно выражаясь)

инициализация - это самое первое заполнение байтиков внутри этого объекта (тоже образно)
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
13.05.2024, 15:30
Цитата Сообщение от pup_kin Посмотреть сообщение
а в чем отличие для переменной/ поля определения от инициализации?
В том, что это разные части синтаксиса.

.cpp:
C++
1
2
3
4
int MyClass::myStaticVar  {50};
------------------------  ----
          |                 |
      определение          инициализация
Добавлено через 2 минуты
Определение обязано быть. (Разные краевые случаи неиспользуемых, но объявленных переменных, приведённые в теме, не рассматриваем, ибо практического смысла в них нет.)
А вот инициализацию можно в программе не указывать, если она не требуется. Тогда по стандарту подразумевается {} (для int это 0)
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
13.05.2024, 15:32  [ТС]
ага
как я понял есть две базовые элемента
объявление и определение.
из них можно сделать третью инициализацию,если я верно понял

объявление + определение равно инициализация.
объявление
int ф;
определение
ф =1;

int ф=1; - инициализация, равная объявление + определение.

я не вижу трех атомарных элементов
может я ошибаюсь.
0
фрилансер
 Аватар для Алексей1153
6461 / 5667 / 1130
Регистрация: 11.10.2019
Сообщений: 15,083
13.05.2024, 15:33
Цитата Сообщение от KSergey9 Посмотреть сообщение
Тогда по стандарту подразумевается {}
- для статических объектов. Для других - будет неинициализированный объект
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2024, 15:33
Помогаю со студенческими работами здесь

Не могу вызвать простой статический класс
Вот такой код получился (VS2017): #pragma once #include &lt;iostream&gt; #include &lt;string&gt; static class Func { ...

Статический полиморфизм. Базовый класс «прямоугольник»
Здравствуйте, дорогие участники форума! Помогите, пожалуйста! Необходимо реализовать статический полиморфизм. Нужно вызвать с помощью...

Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже -->
Слова английского текста рассортировать по возрастанию количества заданной буквы в слове. Слова с одинаковым количеством такой буквы...

создать статический массив строк как статический массив указателей на строки, задание ниже -->
Слова английского текста, начинающиеся с гласных букв, рассортировать в алфавитном порядке по первой согласной букве слова. Остальные слова...

Объясните человеческим языком мне чайнику что такое singleton, статический класс. Зачем они нужны. Что рекомендуете прочитать мне для начала
Объясните человеческим языком мне чайнику что такое singleton, статический класс. Зачем они нужны. Что рекомендуете прочитать мне для...


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

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru