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

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

25.04.2024, 04:02. Показов 10747. Ответов 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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.05.2024, 20:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от pup_kin Посмотреть сообщение
почему в шапрах так можно писать
Шарп - это другой язык.
Это все равно что спрашивать почему у кошки есть хвост, а у вас нет. Потому что так сложились обстоятельства.

Принцип сборки в C# - другой. Те проблемы, которые возникают при использовании Си-шного линкера с С++ в C# просто отсутствуют как класс.

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

Корень кроется в двух аспектах:
1) У статических переменных отдельный, "глобальный" storage (он так и называется static storage duration). По определению этот storage должен быть в единственном экземпляре для каждой переменной.
2) Если предположить, что в языке нет inline для переменных, то обеспечить единственность этого storage становится трудной задачей. Разумный выход - отдать это пользователю (программисту) под контроль.

inline для переменных - это отдельная фича, которую должен поддерживать линкер. Учитывая, что в ранних версиях С++ линкер использовался от языка Си, то об этом не могло идти и речи. В языке Си и для функций-то не было такой возможности.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
07.05.2024, 21:40  [ТС]
т.е. по уму
в классе объявления в том числе и для функций

а в cpp определения.
вот теперь понятно.
а то чехорда
это можно, а это не можно.
для функции можно, а для переменной не можно.

вроде понятно откуда ноги выросли

почему я привел в пример шарп
потому что концепции то ооп они вроде как едины,
я думал может это нарушает какой-то паттерн проектирования, о которых так любят дискутировать в интернетах
я вот и думал, может я чего-то не понимаю, типа делегатов с сиШарп

А тут оказалось история + физика.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
07.05.2024, 21:43
Цитата Сообщение от DrOffset Посмотреть сообщение
Разумный выход - отдать это пользователю (программисту) под контроль.
Но я не вижу этого выхода.
В любом случае нет никаких гарантий какой статический объект создастся первым.
Из за этого, все такие проблемы С++ не решает вообще
А на другое он создает 20+ 23+ 26+ огромное количество хуеты которое никому не всралось.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
08.05.2024, 00:43  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
В любом случае нет никаких гарантий какой статический объект создастся первым.
подумал "да, это оно", но нет.

вот без проблем сделал, даже однофайловый проект оно не отслеживает что член неинициализован.
но при этом ругается когда я его инициализую внутри класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class BB {
public:
    static int  var1;
 
};
 
 
class C {
public:
    static int  var1;
 
};
 
int BB::var1 = C::var1 + 5;
int C::var1 = BB::var1 + 6;
 
int main()
{
    std::cout << BB::var1 << '\n'; // выводит 5
    std::cout << C::var1 << '\n'; // выводит 11
}
обращение к неинициализованной переменной C::var1

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

я не вижу никаких причин кроме исторических в недопустимости определения внутри класса.

Добавлено через 13 минут
но стоит закомментить
C++
1
//int BB::var1 = C::var1 + 5;
и сразу ругается "неразрешенных внешних элементов"
это поведение вообще непонятно.
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
08.05.2024, 05:19
pup_kin, глобальные и статические переменные и статические поля инициализируются принудительно пустым инициализатором {}, даже если его не указать

Цитата Сообщение от pup_kin Посмотреть сообщение
в недопустимости определения внутри класса.
так ведь уже есть такая возможность: inline static type field;
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.05.2024, 09:29
Цитата Сообщение от Алексей1153 Посмотреть сообщение
так ведь уже есть такая возможность
Выше по теме это обсуждалось уже. В данный момент ТС интересует почему этого нельзя добиться с неявным inline, как это происходит с функциями. Ответ: можно, но развитие языка пошло по другому пути.

Цитата Сообщение от SmallEvil Посмотреть сообщение
В любом случае нет никаких гарантий какой статический объект создастся первым.
В одной-то единице трансляции гарантия есть.
Проблема остается только если один статический объект начинает использовать другой, причем в разных единицах трансляции. Однако это достаточно редко происходит при аккуратном программировании. А если и происходит, то синглтон решает эту проблему.
Впрочем это все почти никак не относится к обсуждаемому вопросу (на данный момент). Давайте придерживаться контекста темы.

Цитата Сообщение от pup_kin Посмотреть сообщение
подумал "да, это оно", но нет.
Конечно не оно. Он вообще о другом начал говорить.

Инициализация и storage - это ортогональные понятия. Он вам стал говорить про инициализацию (про ее порядок), а мы с вами выше вели речь про storage.

Добавлено через 3 минуты
Цитата Сообщение от pup_kin Посмотреть сообщение
обращение к неинициализованной переменной C::var1
при этом ошибок нет, и она чудом равна нулю - значит она инициализована значением по умолчанию
Да, инициализирована по умолчанию. Это правило C++ для объектов со статическим временем хранения (глобальные переменные, статические переменные класса, локальные статические переменные) - они всегда инициализированы по умолчанию.

Добавлено через 1 минуту
Цитата Сообщение от pup_kin Посмотреть сообщение
и сразу ругается "неразрешенных внешних элементов"
это поведение вообще непонятно.
Я могу только посоветовать перечитать мои посты.
И запомнить, что инициализация не имеет отношения к этому вопросу. "Ругается" не потому, что нет инициализации, а потому что нет storage (т.е. адресуемого места в памяти, которое создается при определении переменной).
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
08.05.2024, 11:29  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
И запомнить, что инициализация не имеет отношения к этому вопросу. "Ругается" не потому, что нет инициализации, а потому что нет storage (т.е. адресуемого места в памяти, которое создается при определении переменной).
тогда возникает вопрос
какой смысл в инициализации статической переменной, например пустым значением - если использовать ее без storage нет возможности.
Я
мне кажется это лишнее действие.
Или такая возможность есть, разумеется не определяя ее inline.

я так понял есть логическая дырка, и стоит просто принять как данность исторически сложившуюся или как-то иначе.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class BB {
public:
    static int  var1 {}; // тут ругается на {}
 
};
 
 
class C {
public:
    static int  var1 {}; // тут ругается на {}
 
};
 
 
int BB::var1 = C::var1; // 0 
int C::var1 = BB::var1; // 0

а что мешает также по умолчанию и выделить storage для переменных точно также как и инициализация значением по умолчанию.

Я могу как-то повлиять и например выделить storage для BB::var1
в разных местах ?
т.е. могу ли я управлять тем где будет находиться значение переменной в куче, в стеке, еще -где-то ?

Добавлено через 52 секунды
Цитата Сообщение от DrOffset Посмотреть сообщение
Я могу только посоветовать перечитать мои посты.
я перечитываю тему, видео даже не до конца досмотрел
да даже в 1с перечитывая открываешь новое
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
08.05.2024, 11:57
Цитата Сообщение от pup_kin Посмотреть сообщение
какой смысл в инициализации статической переменной, например пустым значением - если использовать ее без storage нет возможности.
Вопрос не совсем понятен.

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

А если есть storage - то есть и инициализация.

Но тогда о чем вопрос?

Добавлено через 1 минуту
Цитата Сообщение от pup_kin Посмотреть сообщение
Я могу как-то повлиять и например выделить storage для BB::var1 в разных местах ?
Для статической (фактически - глобальной) переменной - нет. Да и зачем, собственно?
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.05.2024, 12:44
pup_kin,
Цитата Сообщение от pup_kin Посмотреть сообщение
.е. могу ли я управлять тем где будет находиться значение переменной в куче, в стеке, еще -где-то ?
Выбирая статический класс хранения для переменной, вы уже выбираете память, в которой она будет располагаться - в статической памяти.
Если нужна куча, то нужно создавать переменные с другим классом хранения - динамическим.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
08.05.2024, 12:55  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Выбирая статический класс хранения для переменной, вы уже выбираете память, в которой она будет располагаться - в статической памяти.
тогда получается какой смысл в storage
когда пишем
C++
1
int BB::var1 = 1;
если и так она в статической памяти и инициализирована значением по умолчанию?
т.е. это просто атавизм такой?
что вот надо всегда если не пишем inline инициализировать вручную вне класса
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.05.2024, 13:03
Цитата Сообщение от pup_kin Посмотреть сообщение
если и так она в статической памяти и инициализирована значением по умолчанию?
Нет, здесь вы назначили ей определение в нужной единице трансляции и инициализировали его единицей, здесь нет значения по умолчанию.

Цитата Сообщение от pup_kin Посмотреть сообщение
что вот надо всегда если не пишем inline инициализировать вручную вне класса
Да что ж такое-то!
Не инициализировать, а определять.

То, что у определения может быть инициализация - это свойство самого определения: инициализация делается у определения, не важно явная она или неявная.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
08.05.2024, 23:26  [ТС]
есть объявление и определение.
инициализация - это что-то третье?
видимо терминология не та
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.05.2024, 23:28
pup_kin, inline переменные и ошибка undefined reference, которым посвящены последние страницы этой темы никак не относятся к инициализации. Не понятно зачем ее вообще здесь упоминать.
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
09.05.2024, 05:38
pup_kin, инициализация - это самое первое заполнение содержимого объекта чем-либо.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
10.05.2024, 00:14  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
pup_kin, инициализация - это самое первое заполнение содержимого объекта чем-либо.
вот
когда я пишу

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A{
 
static int var1; // тут происходит и обяъвление переменной var1 и ее инициализация., потому что 
};
 
далее я пишу 
 
class B{
 
static int var1; 
};
 
int B::var = A::var1 + 5; // получается 5
поэтому мне непонятно почему A::var1 если я ее буду использовать в опредлении функции внутри класса
скажет undefined reference.


т.е. для полей и для методов разное поведение.
это просто надо запомнить
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
10.05.2024, 03:43
Цитата Сообщение от pup_kin Посмотреть сообщение
static int var1; // тут происходит и обяъвление переменной var1 и ее инициализация., потому что
Нет, никакой "инициализации" тут не происходит. Откуда вы это взяли?

Цитата Сообщение от pup_kin Посмотреть сообщение
int B::var = A::var1 + 5; // получается 5
Нет, это вообще не скомпилируется, ибо переменная A::var1 у вас не определена. Будет ошибка undefined reference.

Цитата Сообщение от pup_kin Посмотреть сообщение
поэтому мне непонятно почему A::var1 если я ее буду использовать в опредлении функции внутри класса скажет undefined reference.
По той же причине. Переменная не определена.

Цитата Сообщение от pup_kin Посмотреть сообщение
т.е. для полей и для методов разное поведение.
это просто надо запомнить
Нет никакого разного поведения. Поведение одно и то же: undefined reference во всех случаях.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
10.05.2024, 10:31  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет, это вообще не скомпилируется, ибо переменная A::var1 у вас не определена. Будет ошибка undefined reference.
вооот в этом у меня и непонятка, по логике оно не должно компилироваться.
Но, однако, прекрасно компилируется и работает, и значение A::var1 равно 0.

визуал студио, стандарт 14 кажется -минимальный в котором сработал пример со static inline.

всем спасибо.
я так понял что это просто исторически так сложилось.
как DrOffset и писал , и понять это не имеет смысла.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
10.05.2024, 11:07
Цитата Сообщение от pup_kin Посмотреть сообщение
по логике оно не должно компилироваться.
Но, однако, прекрасно компилируется и работает, и значение A::var1 равно 0.
Это какая-то самодеятельность MSVC, которая вас запутала. В стандартном C++ это не компилируется.
Если уж и хотите что-то запомнить без понимания, то запомните это.

Добавлено через 4 минуты
Цитата Сообщение от pup_kin Посмотреть сообщение
как DrOffset и писал , и понять это не имеет смысла.
Вы как-то слишком сильно обобщили мой ответ, что исказило его смысл.

Я говорил лишь о том, что поведение статических переменных класса в части отсутствия их неявной инлайновости как (у функций) обсусловлено историческими причинами.

Все остальное, что здесь обсуждалось, можно и нужно понимать, без попыток свалить на то, что DrOffset сказал, что в этом можно не разбираться. Я такого не говорил.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
10.05.2024, 14:18  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В стандартном C++ это не компилируется.
да, если бы оно заругалось вопросов бы не возникло.

НО , оно даже в ардуино ИДЕ нормально компилируется

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A{
  public:
static int var1;
};
 
class B{
  public:
static int var1;
};
 
int B::var1 = A::var1;
int A::var1 = 3;
// и в итоге B::var1 равно 0 
// A::var1 равно  3;
void setup() {
  // put your setup code here, to run once:
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}
только что проверил.
компиляторы ардуины и вижуал студио не ругаются
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
10.05.2024, 14:45
Цитата Сообщение от pup_kin Посмотреть сообщение
компиляторы ардуины и вижуал студио не ругаются
Так тут у вас есть определение.
Вы же совсем другой пример показывали выше и ответ TheCalligrapher был о нем.

Ваш текщий пример не про определения вовсе, он про порядок инициализации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.05.2024, 14:45

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru