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

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

25.04.2024, 04:02. Показов 10194. Ответов 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
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
10.05.2024, 14:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Ваш текщий пример не про определения вовсе, он про порядок инициализации.
Ещё и похоже на UB.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
10.05.2024, 15:02
Цитата Сообщение от pup_kin Посмотреть сообщение
и в итоге B::var1 равно 0
Нет, B::var1 равно 3.

В C++ есть два вида инициализации статических переменных: статическая инициализация и динамическая.

B::var1 = A::var1; - это динамическая инициализация.
A::var1 = 3; - это статическая инициализация.

Статическая инициализация, всегда, гарантированно выполняется раньше. Поэтому B::var1 будет равна 3.

Соответствующий текст стандарта C++:
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.

Constant initialization is performed:

if each full-expression (including implicit conversions) that appears in the initializer of a reference with static or thread storage duration is a constant expression (5.19) and the reference is bound to an lvalue designating an object with static storage duration or to a temporary (see 12.2);
if an object with static or thread storage duration is initialized by a constructor call, if the constructor is a constexpr constructor, if all constructor arguments are constant expressions (including conversions), and if, after function invocation substitution (7.1.5), every constructor call and full-expression in the mem-initializers and in the brace-or-equal-initializers for non-static data members is a constant expression;
if an object with static or thread storage duration is not initialized by a constructor call and if every full-expression that appears in its initializer is a constant expression.

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. <...>
Это была теория. А теперь практика, открываем VS и видим вывод - 3. В полном соответствии с теорией.
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
10.05.2024, 15:03
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ещё и похоже на UB.
Не, это не UB.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
11.05.2024, 02:21  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Нет, B::var1 равно 3.
да , действительно.

а что такое UB?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12944 / 6811 / 1821
Регистрация: 18.10.2014
Сообщений: 17,236
11.05.2024, 02:29
Цитата Сообщение от pup_kin Посмотреть сообщение
да , действительно.
Так о чем тогда было ваше сообщение #95?

Вы зачем-то напридумывали, что есть разница в использовании этих переменных за пределами функций или внутри функций. Это оказалось неправдой, никакой разницы нет.

Вы зачем-то напридумывали, что код компилируется. Это оказалось неправдой, код не компилируется. Undefined reference.

Вы зачем-то напридумывали, что B::var1 у вас равно 0. Это оказалось неправдой, к вас, как и у всех, B::var1 у вас равно 3.

Так откуда и зачем вы накопали этот ворох выдумок и вывалили их сюда? Откуда вы это все взяли?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
11.05.2024, 11:20
Цитата Сообщение от pup_kin Посмотреть сообщение
а что такое UB?
Undefined behavior (1)
0
0 / 0 / 0
Регистрация: 09.03.2024
Сообщений: 19
11.05.2024, 13:17
Как всегда завсегдатаи налетели на обычный класс и хотят сделать из него чуть ли не новый стандарт c++

Добавлено через 2 минуты
Пацан который создал эту тему лучше удали её и вообще уйди с этого похабного форума, я уже проверил данный форум, написал говнокод и выложил его к себе в профиль, можешь посмотреть как я троллил там дурачков которые даже не шарят в IQ коде)
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
11.05.2024, 16:13  [ТС]
а, да , действительно.

а что такое UB?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вы зачем-то напридумывали, что код компилируется. Это оказалось неправдой, код не компилируется. Undefined reference.
код компилируется.
сколько раз мне надо написать что код компилируется
?

Добавлено через 48 секунд
как здесь видео ввыложить?
выложу видос на ютуб,
прикреплю ссылку.

или картинку.

Добавлено через 5 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вы зачем-то напридумывали, что B::var1 у вас равно 0. Это оказалось неправдой, к вас, как и у всех, B::var1 у вас равно 3.
Так откуда и зачем вы накопали этот ворох выдумок и вывалили их сюда? Откуда вы это все взяли?

минуту
загрузчик на сайт как-то долго работает

Добавлено через 3 минуты
ой, ляяя
Это BMP3 изображение имеет неверное расширение.


Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так о чем тогда было ваше сообщение #95?
Вы зачем-то напридумывали, что есть разница в использовании этих переменных за пределами функций или внутри функций. Это оказалось неправдой, никакой разницы нет.
Вы зачем-то напридумывали, что код компилируется. Это оказалось неправдой, код не компилируется. Undefined reference.
Вы зачем-то напридумывали, что B::var1 у вас равно 0. Это оказалось неправдой, к вас, как и у всех, B::var1 у вас равно 3.
Так откуда и зачем вы накопали этот ворох выдумок и вывалили их сюда? Откуда вы это все взяли?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class BB {
public:
    static int  var1;
 
};
 
 
class C {
public:
    static int  var1;
 
    void print()
    {
        std::cout << C::var1 << '\n';
    };
 
};
 
 
int BB::var1 = C::var1;
int C::var1 = BB::var1;
 
 
int main()
{
    std::cout << BB::var1 << '\n'; // 0
    std::cout << C::var1 << '\n'; // 0
}

все прекрасно компилируется и работает.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
11.05.2024, 16:34
Цитата Сообщение от Egor Galkin Посмотреть сообщение
как я троллил там дурачков которые даже не шарят в IQ коде
Это оно ?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12944 / 6811 / 1821
Регистрация: 18.10.2014
Сообщений: 17,236
11.05.2024, 16:36
Цитата Сообщение от pup_kin Посмотреть сообщение
сколько раз мне надо написать что код компилируется?
Да хоть миллион. Многократное повторение одной и той же чуши не делает ее истиной.

Цитата Сообщение от pup_kin Посмотреть сообщение
все прекрасно компилируется и работает.
Вам по-моему уже 50 раз объяснили, причем несколько человек, что речь идет о вашем коде из сообщения #95. И о тех странных утверждениях об ошибке "undefined reference", которые вы сделали в сообщении #95.

К чему вы нам теперь тут приводите какой-то совершенно другой код и рассказываете, что он у вас "компилируется"? При чем он здесь вообще? Отложите сейчас все и напишите в форум подробное объяснение по этим вопросам (на странички 2-3 будет достаточно).
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
11.05.2024, 16:55
Цитата Сообщение от pup_kin Посмотреть сообщение
int BB::var1 = C::var1;
int C::var1 = BB::var1;
А не должно ?

Я думаю тут подходит следующее правило:
An implementation is permitted to perform the initialization of a variable with static or thread storage duration as a static initialization even if such initialization is not required to be done statically, provided that
(3.1)
the dynamic version of the initialization does not change the value of any other object of static or thread storage duration prior to its initialization, and
(3.2)
the static version of the initialization produces the same value in the initialized variable as would be produced by the dynamic initialization if all variables not required to be initialized statically were initialized dynamically.
А вообще, вы как то не о том задумываетесь. Или для вас уже пришла такая необходимость ?
И способ и порядок инициализации статических объектов ?
Если да, то укажите этот конкретный случай или грызите Штандарт (он же c++draft).
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
12.05.2024, 09:32  [ТС]
ntcntest
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12944 / 6811 / 1821
Регистрация: 18.10.2014
Сообщений: 17,236
12.05.2024, 17:51
Я могу подтвердить, что если исправить уж совсем грубые ошибки в коде из сообщения #95 (нарушения доступа, опечатки в именах переменных), то вот такой вариант будет компилироваться в Arduino IDE

C++
1
2
3
4
5
6
7
8
// Переформатировано для компактности
struct A { static int var1; };
struct B { static int var1; };
 
int B::var1 = A::var1 + 5;
 
void setup() {}
void loop() {}
И это несмотря на то, что переменная A::var1 не определена.

Причина: Arduino IDE при вызове gcc указывает флаги -flto -Os. (Похоже, что gcc нужны именно оба флага.) Именно благодаря этим флагам gcc в такой ситуации, выполнив link time optimizations, не считает переменную A::var1 "используемой" и не требует для нее определения. Этот эффект воспроизводим в gcc и за пределами Arduino IDE.

Clang для воспроизведения такого поведения достаточно просто -flto

---

Однако надо добавить (сразу не заметил), что переменная A::var1 при этом считается "ненужной" только потому, что переменная B::var1 в таком примере считается "ненужной".

Достаточно добавить в код

C++
1
2
3
4
void setup()
{
  Serial.println(B::var1);
}
и Arduino IDE сразу же начнет ругаться на неопределенную A::var1.

То есть исходные заявления ТС о том, что переменная B::var1 якобы получает значение 5 даже в отсутствие определения A::var1, действительности не соответствуют. "Проскочить без определения" в таком примере можно только тогда, когда обе переменных удается устранить полностью. А нет переменной - нет и значения.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
13.05.2024, 07:37  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
То есть исходные заявления ТС о том, что переменная B::var1 якобы получает значение 5 даже в отсутствие определения A::var1,
не, это не совсем так.
там же ниже еще код был

там даже мейн еще есть

в котором собственно и производятся все операции

как по мне
это вообще странно

ругается на то что если а разместить после Б
и попытаться написать
int B::var1 = A::var1 + 5;

скажет класс неопредеделен

но при этом допускает
int B::var1 = A::var1 + 5;


- хотя смысла в этом нет.

исходный пример был

int B::var1 = A::var1 + 5; // тут 5
int A::var1 = B::var1 + 6; // тут 11
я ж пишу код ручками, не открываю вс.

в этом и был вопрос , если ты не понял.

на кой ляд мне вот это вот:
int B::var1 = A::var1 + 5; // тут 5
к которому я даже использовать его не могу.
как оно вообще пролезло.

и не будет ли лучшим вариантом
инициализация в при объявлении класса в теле класса.

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

Добавлено через 3 минуты
и тем более странным выглядит

C++
1
2
int B::var1 = A::var1 + 5; // тут 5
int A::var1 = B::var1 + 6; // тут 11
и в мейне
C++
1
cout <<B::var1 << A::var1 ;
оооо, боже, я же не написал using namespase std
поэтому мой пример некорректен.

и забыл двоеточие ,
так это пост 114
давай "халауду" разведем про пост 114

Добавлено через 1 минуту
про конкретный пост 114 - давай

наличие абстрактного мышления - отличает
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
13.05.2024, 07:39
Цитата Сообщение от pup_kin Посмотреть сообщение
я ж пишу код ручками, не открываю вс.
а ты щас до запятой доебался .
Т.е. TheCalligrapher, в отличии от вас, не стал чесать языком, фантазировать и накидывать бред, а по-честному провёл эксперимент, подробно описал его результаты и условия воспроизведения, разжевал причины - а вы ему в ответ вот это всё?!

Ну что сказать, успехов в работе.

Добавлено через 1 минуту
Цитата Сообщение от pup_kin Посмотреть сообщение
наличие абстрактного мышления - отличает
Абстрактного болтуна от профессионала. Да и вообще брехуна от приличного человека. Дада, так всё и есть.
2
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
13.05.2024, 11:46  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Т.е. TheCalligrapher, в отличии от вас, не стал чесать языком, фантазировать и накидывать бред, а по-честному провёл эксперимент, подробно описал его результаты и условия воспроизведения, разжевал причины - а вы ему в ответ вот это всё?!
это понятно что компиляторы могут по своему обрабатывать, можно свой компилятор написать который вообще сам будет код писать.
тут вопрос не в том что почему,
а вопрос для чего такое алогичное поведение может понадобиться?
если уж тогда разрешать такую балалайку как инициализацию чего хотим и как хотим, тогда не вижу причин запрещать инициализацию статик внутри класса.

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

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

всё.

Добавлено через 3 минуты
человек сознательно уводит тему в сторону, я это так вижу.
и начинает к запятым придираться.
а че там исследование
открой диспетчер да посмотри какие параметр запуска.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.05.2024, 13:06
Цитата Сообщение от pup_kin Посмотреть сообщение
а вопрос для чего такое алогичное поведение может понадобиться?
Чего-чего, а алогичности в С++ мало где есть, и если кажется что она есть, это значит лишь неосведомленность о деталях.
Если исследовать ЯП С++ по такому пути, не хватит и жизни. (кроме случаев на все непонятки отвечать себе : так исторически сложилось, это ответ на малую часть: почему).

Но по вашему случаю, в самом простом исполнении : https://onlinegdb.com/tFz-fmtB_

Цитата Сообщение от pup_kin Посмотреть сообщение
и тем более странным выглядит
C++
1
2
int B::var1 = A::var1 + 5; // тут 5
int A::var1 = B::var1 + 6; // тут 11
Очень странно выглядит такое писать, как будто у вас какое то расстройство...

Добавлено через 3 минуты
p.s. pup_kin, ко всему прочему, С++ , как и все ЯП - несовершенны и имеют те или иные баги, как в архитектуре так и в реализации в виде компиляторов и библиотек.
Понять где баг а где ваши заблуждения, возможно лишь изучив концепции, подходы и синтаксис ЯП, при том почти досконально.
А гадать, это для гадалок-цыганок.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
13.05.2024, 13:09
Цитата Сообщение от pup_kin Посмотреть сообщение
и тем более странным выглядит
Если разобраться в цитате из стандарта, которую я привел выше, то все странности сразу же пропадут.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.05.2024, 13:14
Цитата Сообщение от pup_kin Посмотреть сообщение
ответ достаточно прозаичен - исторически так сложилось.
инструменты написаны так, есть куча старого кода - который надо поддерживать.
всё.
Кликните здесь для просмотра всего текста




Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Если разобраться в цитате из стандарта, которую я привел выше, то все странности сразу же пропадут.
Да я читал, и ещё немного почитал отдельно, всё не так просто со статическими переменными и их инициализацией, но не всё так страшно.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
13.05.2024, 14:49  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Но по вашему случаю, в самом простом исполнении : https://onlinegdb.com/tFz-fmtB_
а что показывает данный пример?
как по мне он не должен работать.
но он работает,
но значит я ошибся.
значит другие правила.

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


в первом посте я вообще забыл инициализировать переменную, я вообще не думал об этом даже.

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru