16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510

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

25.04.2024, 04:02. Показов 11095. Ответов 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
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,319
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
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,319
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
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,319
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
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,319
13.05.2024, 15:12
pup_kin, конечно же инициализация у статических объектов есть всегда
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
13.05.2024, 15:12  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
(тут для статических объектов нулевая принудительная инициализация либо указанная программистом. Для остальных объектов может не быть инициализации)
вопрос если произошла нулевая статическая инициализация - означает ли это что сущностью можно пользоваться ?
0
фрилансер
 Аватар для Алексей1153
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,319
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
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,319
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
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,319
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
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,319
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru