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

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

25.04.2024, 04:02. Показов 10807. Ответов 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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6313 / 3036 / 1053
Регистрация: 01.06.2021
Сообщений: 11,558
26.04.2024, 20:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от _stanislav Посмотреть сообщение
хочется уменьшить лишнюю писанину
для меня это не аргумент

хочется уменьшить писанину - меняй язык

Если код для себя, то можно писать как угодно. Но кому, блет, нужны такие bloated заголовки? Вы задумывайтесь, как вообще переводится слово header и для чего он предназначен. Ну и что с того, что вы написали все в заголовке и файлов стало меньше? Блет, пишите всё в одном main.cpp и будет вам один файл)))
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
26.04.2024, 20:58
Цитата Сообщение от Royal_X Посмотреть сообщение
Зачем впихивать всё в заголовок?
Когда можно не пихать, то лучше не пихать.
Но иногда это просто нужно сделать. Так же, как, например, нужно делать с шаблонами.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
26.04.2024, 21:37
Цитата Сообщение от DrOffset Посмотреть сообщение
Но иногда это просто нужно сделать.
В каких ситуациях без inline не обойтись?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
26.04.2024, 21:51
Цитата Сообщение от _stanislav Посмотреть сообщение
В каких ситуациях без inline не обойтись?
Я просто один пример приведу, но это не значит, что других не бывает.

Например у нас есть Си-библиотека (или просто библиотека с Си-интерфейсом).
Зачем делают библиотекам Си-интерфейс, я думаю, ни для кого не секрет: ABI Си стабильно и поддерживается большинством программных систем.
Но у Си-интерфейс есть недостатки, в частности необходимость вручную контролировать время жизни ресурсов.
Как можно получить преимущества С++, но при этом не потерять в переносимости? Допустим, я хочу написать библиотеку в VC++, но дать возможность ей пользоваться из любого компилятора С и С++ под Windows. Я делай ей Cи API, и делаю ей C++ API, которое полностью inline и инкапсулирует работу с Си API. Т.к. все функции в С++ API - inline, т.е. не экспортируются, то различие ABI при использовании его из разных компиляторов не играет роли: каждый компилятор собирает его так, как ему нужно, сводя все в итоге к сишным вызовам, которые уже переносимы. Хорошо написанная таким образом библиотека не выдает свою Си-сущность, пользователь не заглядывая в заголовочный файл даже и не знает, что на самом деле пользуется Си-интерфейсами. Добиться этого без inline api просто невозможно.
2
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
26.04.2024, 23:30  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Видео посмотрите.
кстати в этом видео
определение переменной
C++
1
int var;
а объявление
C++
1
extern int var;
занятно
я написал определение потому что изначально указал явно значение
C++
1
static int var1 = 5;
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
26.04.2024, 23:51
pup_kin, там в примере в видео была глобальная переменная, а у вас статическая в классе.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
27.04.2024, 02:23  [ТС]
а такое усложнение языка с++ оно с чем-то связано ?
с тем что каждый пишет кто во что горазд, и потом при слиянии проектов возникают всякие инциденты?
т.е. что не выработан общий стиль какой-то?
потому что пипец, мне кажется на осмысление того доклада ну минимум неделя нужна- а по уму наверн месяц,
а это базовые вещи - это даже не прикладная задача.
это наверное все актуально при распределенной команде и групповой разработке?

Добавлено через 1 час 35 минут
а как раньше справлялись с множественным определением, когда не было "inline" - писали код по другому?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
27.04.2024, 04:33
Цитата Сообщение от DrOffset Посмотреть сообщение
Я просто один пример приведу, но это не значит, что других не бывает
Покажи пожалуйста пример кода.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
27.04.2024, 08:50
Цитата Сообщение от pup_kin Посмотреть сообщение
а такое усложнение языка с++ оно с чем-то связано ?
Связано в основном с совместимостью с Си.
Есть книга "Дизайн и эволюция С++" от автора языка, она малотехническая, в основном написана как мемуары. Там все про это есть, про причины, про сложность истинную и мнимую. Я уже понял, что вы не особо любите читать, но если уж взялись за С++, это придется преодолеть. Иначе у вас ничего не получится с этим языком.

Цитата Сообщение от pup_kin Посмотреть сообщение
т.е. что не выработан общий стиль какой-то?
Общий стиль выработан. Описан здесь: https://isocpp.github.io/CppCo... Guidelines
Большая часть расхождений с ним связана с какими-то техническими нюансами конкретных проектов или историческими причинами.

Цитата Сообщение от pup_kin Посмотреть сообщение
потому что пипец, мне кажется на осмысление того доклада ну минимум неделя нужна- а по уму наверн месяц,
Это всегда так. Если что-то далось легко, значит скорее всего что-то было упущено.
Если вы думаете, что в каком-нибудь C# нормально разбираться сильно проще, то вы ошибаетесь. Да, там сложность распределена иначе, но она все равно есть. И у тех, тех кто игнорирует нюансы все равно будут проблемы, или будут проблемы у тех, кто пользуется результатами их поверхностного программирования.

Цитата Сообщение от pup_kin Посмотреть сообщение
а как раньше справлялись с множественным определением, когда не было "inline" - писали код по другому?
В раннем Си не было inline и его нишу занимали макросы.
Да, код писали по-другому.

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

Добавлено через 12 минут
Цитата Сообщение от _stanislav Посмотреть сообщение
Покажи пожалуйста пример кода.
Для Windows показательный пример - это WTL + WinAPI.
1
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
27.04.2024, 09:01
Цитата Сообщение от pup_kin Посмотреть сообщение
а как раньше справлялись с множественным определением, когда не было "inline" - писали код по другому?
extern
Во всех cpp-файлах, кроме одного.

Цитата Сообщение от pup_kin Посмотреть сообщение
а это базовые вещи - это даже не прикладная задача.
Вы меня, конечно, извините, но просто вы ерундой занимаетесь, от того и грабли.
На кой вам именно статический класс понадобился?
Для решения вашей задачи C++ предлагает другие конструкции, вот и весь секрет. Тот же namespace, например. Или любимый в С++ среде синглтон. И никакие "статические" классы не требуются.

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

Добавлено через 3 минуты
PS
Как-то видел код на C#, написанный матёрыми С++ никами.
Так там половина кода состояла из using{}, т.к. парни в принципе не понимали и не принимали концепцию "как это так, деструктор вызовется хрен знает когда?!". Еще раз: это были реально толковые и матёрые С++ программисты, цитировавшие стандарт наизусть, но вот такая вот проф-деформация.
Они просто не умели иначе мыслить плюс пару раз обожглись об незакрытый вовремя файл (в деструктуре же должен был закрыться! уже же вышел из области видимости!)
Ну и понеслась

Хотя на мой вкуса - дельфиста - конструкция try / finally, которая в C# имеет место быть, в тех случаях, когда это требуется (типа закрыть файл) - намного нагляднее, чем using.
Но т.к. в С++ try/finally нет - про паттерны его использования никто из этих парней даже и не подумал, а может и не в курсе такой фичи.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
27.04.2024, 09:24
Цитата Сообщение от KSergey9 Посмотреть сообщение
Но т.к. в С++ try/finally нет - про паттерны его использования никто из этих парней даже и не подумал, а может и не в курсе такой фичи.
Что-то мне слабо верится, что виндовые программисты на С++ про это не знают. В MSVC++ эта конструкция уже кучу лет присутствует в качестве расширения. Я ей уже в 2003 году пользовался, когда еще под винду писал. Вот юниксоиды да, будут крутить у виска
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
27.04.2024, 09:35
Цитата Сообщение от DrOffset Посмотреть сообщение
В MSVC++ эта конструкция уже кучу лет присутствует в качестве расширения.
Лично я её в плюсовом коде не видел не разу, кроме микрософтовской реализации stl
Да она и не нужна в общем-то в С++.

И таки да, это были по большей части юниксовые программисты.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
06.05.2024, 03:58  [ТС]
я чет совсем отупел

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// для подсчета пройденного пути
class odometr {
public:
  
  static int t;
 
   static int test(const int &g){
    t+=g;
    Serial.println(t);
    return t;
  };
  
  // здесь Inline используется для того чтобы сделать static
  static inline float LastLatitude{}, CurLatitude{}, LastLongitude{}, CurLongitude{}, deltaLatitude{}, deltaLongitude{}, bufmileage{}, mileage{};
 
  static float calculateTheMovement(const float& Latitude, const float& Longitude) {
при этом вызываю

C++
1
2
3
4
5
6
7
8
9
10
11
int odometr::t = 1;
 
void setup() {
 
int iii = odometr::test(5);
 
....
 
DE_mileage.SetCurValue(String(odometr::calculateTheMovement(GPSData[1].toFloat(), GPSData[3].toFloat())));
...
}
вопрос
почему в одном случае нормально работает без inline

статическое поле и метод
t и test

и требует inline
для
C++
1
static inline float LastLatitude{}, CurLatitude{}, LastLongitude{}, CurLongitude{}, deltaLatitude{}, deltaLongitude{}, bufmileage{}, mileage{};
без inline пишет undefined reference для метода calculateTheMovement

в котором используются переменные LastLatitude и др.

Добавлено через 8 минут
ага
при изменении кода внутри calculateTheMovement
с
C++
1
if (odometr::LastLatitude == 0.0 || odometr::LastLongitude == 0.0) {
на
C++
1
 if (odometr::LastLatitude == 0.0 || odometr::LastLongitude == 0.0) {
т.е. Inline
многое упрощает?
верно ли понимают что можно везде ставить inline - и это не будет плохо и в последующих релизах - эта тенденция сохраниться?
0
фрилансер
 Аватар для Алексей1153
6495 / 5726 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
06.05.2024, 06:35
Цитата Сообщение от pup_kin Посмотреть сообщение
static inline float LastLatitude;
так - это объявление + определение.

Цитата Сообщение от pup_kin Посмотреть сообщение
static float LastLatitude;
а так - просто объявление
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.05.2024, 08:17
Цитата Сообщение от pup_kin Посмотреть сообщение
static int test(const int &g){
Здесь функция test тоже inline (неявно), потому что целиком находится в теле класса.

Цитата Сообщение от pup_kin Посмотреть сообщение
почему в одном случае нормально работает без inline
Потому что определение t есть в cpp.

Добавлено через 2 минуты
Цитата Сообщение от pup_kin Посмотреть сообщение
и требует inline для
C++
1
LastLatitude{}, CurLatitude{}, LastLongitude{}, CurLongitude{}, deltaLatitude{}, deltaLongitude{}, bufmileage{}, mileage{};
Ну так сделайте с ними так же, как вы сделали с t. И не нужен будет inline.

И вы должны понять (это обязательно), что он от вас не inline требует. а определение. А уж как вы его (определение) предоставите, через inline или как - это уже ваше дело.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
06.05.2024, 19:40  [ТС]
а чем плохо инициализация в классе неконстантного статического выражения?
какие могут быть последствия от такой инициализации?

Compilation error: ISO C++ forbids in-class initialization of non-const static member 'odometer::tachometer'

чем инициализация вне тела класса

C++
1
2
3
4
5
classs odometer{
...
};
...
float odometer::tachometer {};
лучше аналогичной внутри тела?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
06.05.2024, 23:51
Цитата Сообщение от pup_kin Посмотреть сообщение
а чем плохо инициализация в классе неконстантного статического выражения?
какие могут быть последствия от такой инициализации?
Вы ы зеркало смотрите ?
Какое может быт последствия, что вы просто подумаете что встали и не встали.
/подумали что пришли на работу но не пришли.
Подумали что спасли друга но не спасли.
И ? Раница есть ?

Лучше продавайте бургеры.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
07.05.2024, 20:11  [ТС]
вообще не понимаю какая разница

C++
1
2
3
4
5
class test{
 
static int var1 = 1;
 
}

или
C++
1
2
3
4
5
6
7
class test2{
 
static int var ;
 
}
 
int test2::var1 = 1;
Добавлено через 47 секунд
что плохого произойдет если я внутри класса инициализирую поле?

Добавлено через 9 минут
более того
в шарпах к примеру так и работает и ничего страшного не происходит
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    class test {
 
        public static String t = "fhdfjdgf";
    
    };
 
    public partial class Form1 : Form
    {
        Thread myThread;
        String[] FileNames = { };
        int i = 0;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
            MessageBox.Show(test.t);
        ....
возможно это какая-то парадигма именно с++ имевшая раньше историческую подоплеку в виде класса в разных файлах?
но опять же непонятно.
почему в шапрах так можно писать, а в с++ нельзя?
для чего инициализация именно вне класса нужна?
или это просто стоит принять как особенность синтаксиса языка и не думать ?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.05.2024, 20:12
pup_kin, сугубо исторические причины.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
07.05.2024, 20:13  [ТС]
т.е. из хедера и сипипи
я вспомнил, я то пишу все в одном.

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru