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

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

25.04.2024, 04:02. Показов 10750. Ответов 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
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,537
25.04.2024, 13:58
Студворк — интернет-сервис помощи студентам
DrOffset, я вообще изначально думал, что у ТС один файл...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
25.04.2024, 14:07
Royal_X, у ТС вполне определенный и достаточно узкий контекст вопроса:
1) он не хотел иметь «лишних» cpp (читай как запихать все в header)
2) у него была одна конкретная проблема с ODR (имя было ODR-used, но определение отсутствовало)
И ещё одна потенциальная проблема при отказе от cpp (наоборот, множественное определение, если перенести определение в header), как показал Алексей в своём посте.

inline все эти нюансы закрывает.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,537
25.04.2024, 14:13
DrOffset, прочёл только что условие, ТС упоминает модули. Может быть он хочет использовать https://en.cppreference.com/w/cpp/language/modules ?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
25.04.2024, 14:32
Цитата Сообщение от DrOffset Посмотреть сообщение
inline все эти нюансы закрывает.
А мой вариант закрывает вообще всё.
И кому от этого легче.

For ALL
Не поддавайтесь безумию и деградации.
Надумывание - один из признаков деградации.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,537
25.04.2024, 14:45
Цитата Сообщение от SmallEvil Посмотреть сообщение
For ALL
Не поддавайтесь безумию и деградации.
Надумывание - один из признаков деградации.
ТС спрашивает, какой крепкий микроскоп выбирать. И тут ему эксперты советы дают разные. Но никто не спросил, мол для чего тебе такой микроскоп. А быть может у него уже гвозди готовы...
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
25.04.2024, 15:27  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
pup_kin, ваша задача в С++ решается иначе, другими средствами:
да типа такого надо, но хотелось классом.
потому что вдруг потом захочу сделать экземпляры класса.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
25.04.2024, 15:36
Цитата Сообщение от Royal_X Посмотреть сообщение
гвозди готовы...
Ох, так всегда легче ...

Добавлено через 1 минуту
Цитата Сообщение от pup_kin Посмотреть сообщение
потому что вдруг потом захочу сделать экземпляры класса.
Тгдым, мама тыгыдым...

Тогда всё придется переписывать и пере-какывать.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
25.04.2024, 16:27
Цитата Сообщение от Royal_X Посмотреть сообщение
DrOffset, Алексей1153, я эти ваши inline не понимаю. Современные компиляторы сами решают, использовать их или нет. Вручную inline прописывали только при царе Горохе. Я даже проверил специально, что с inline, что без, одинаковый ассемблерный код.
Слышал звон, да не знал где он.

Процитированный вам текст ведет речь о том, что слово inline потеряло свою изначальную роль "запроса встраивания функции". Назначение inline в современном С++ - это модификация ODR. В этой роли inline критически важно и используется повсеместно и обязательно. Ни о каком избегании использования inline не может быть и речи.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
25.04.2024, 19:05  [ТС]
таким образом + поигравшись в визуал студио
получается невозможно в с++ создать полностью статический класс.
что я имею ввиду под "полностью статическим"
это то что внутри класса есть статические методы и я хочу их вызвать не создавая экземпляр класса.

т.е. есть вариант только с использованием namespace ?
другого нет?
возникает вопрос - почему такого нет?

Добавлено через 4 минуты
Цитата Сообщение от KSergey9 Посмотреть сообщение
namespace SomeClass {
float var1{}, var2{}, varN{};
   float somethingMethod(){
   //тут использую переменные var1, var2....
   };
}
и вызов
C++
1
SomeClass::somethingMethod()

я хочу чтобы вместо namespace был class - и этого не реализовать?
это противоречит какой-то концепции или чему-то еще?

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

пардон , ошибочка - в namespace тоже не ругает.
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
25.04.2024, 19:06
тебе же показали в 5м посте такой класс
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
25.04.2024, 19:10  [ТС]
Цитата Сообщение от sdf45 Посмотреть сообщение
тебе же показали в 5м посте такой класс
это он
C++
1
2
3
4
5
6
7
8
3
4
5
struct A{
   A() = delete;
   inline static type var1{}, var2{}, varN{};
   static void Method(){};
};
Добавлено через 1 минуту
ну так это не он - зачем мне структура
я тогда наймспейс сделаю.
я хочу именно класс
но чтобы у него были статические методы, но можно было и создать экземпляр класса - вот сформулировалось.

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



C++
1
2
3
4
5
6
//и чтобы статические методы вызывались 
someclass::staticMethod1(); // ради этого всё и затевается чтобы не создавать экземпляр, но статика чтобы была доступна даже когда экземпляров нет - в этом и смысл статики
 
// а не статические 
someclass Документ1(......);
Документ1.распределитьрасходы();
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
25.04.2024, 19:15
Цитата Сообщение от pup_kin Посмотреть сообщение
ну так это не он
почему? что голову морочишь то?

Добавлено через 3 минуты
Цитата Сообщение от pup_kin Посмотреть сообщение
зачем мне структура
лутше ты этого не писал бы, щас начнется
ну замени struct на class, поля и конструктор перенеси в private а методы (нужные для доступа) в public
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
25.04.2024, 19:22  [ТС]
Цитата Сообщение от sdf45 Посмотреть сообщение
ну замени struct на class, поля и конструктор перенеси в private а методы (нужные для доступа) в public
так не работает когда заменяю
я ж поэтому и пишу

Добавлено через 1 минуту
C++
1
2
3
4
5
6
class A {
    A() {};
    A() = delete;
    //inline static float var1{}, var2{}, varN{};
    static void Method() {};
};

как вызвать Method?
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
25.04.2024, 19:23
Цитата Сообщение от pup_kin Посмотреть сообщение
как вызвать Method?
A::method();
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
25.04.2024, 19:24
pup_kin, если сделать все элементы со словом "static", то и получится это чудо-юдо как в шарпе.

Поля всё равно лучше "наверху" такого класса расположить, зачем бардак разводить?

структура в этом плане ничем не отличается от класса

Добавлено через 28 секунд
Цитата Сообщение от pup_kin Посмотреть сообщение
A() {};
    A() = delete;
это не нужно, можно убрать
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
25.04.2024, 19:24  [ТС]
собственно вот и вопрос
у меня есть точно такой же класс как в примере 5
и у него есть статические методы и статические переменные
и как их вызывать
в этом и вопрос

Добавлено через 18 секунд
Цитата Сообщение от sdf45 Посмотреть сообщение
A::method();
недоступно
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
25.04.2024, 19:25
Цитата Сообщение от pup_kin Посмотреть сообщение
недоступно
так сделай структуру или явно пропиши доступ public: в начале класса
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
25.04.2024, 19:33  [ТС]
блин, точно
)) сорян публик
столько суеты развел
всем спасибо

Добавлено через 4 минуты
а стоп, какой публик c этого же и началось все вчера

такой код не работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct  A {
public:
    //A() {};
    //A() = delete;
    static int var1, var2, varN;
    //inline    static int var1, var2, varN; -- без разницы
    static void Method() {
        var1++;
        std::cout << var1 << '\n';
    };
};
 
 
int main()
{
    A::Method(); // ругается на var1  неразрешимых внешних элементов
Добавлено через 1 минуту
получается рабочий только вариант с namespace,
а внутрь него положить статику и класс.
Других вариантов нет?
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
25.04.2024, 19:37
Цитата Сообщение от Алексей1153 Посмотреть сообщение
это не нужно, можно убрать
тогда можно будет обьект класса создать вроде?

pup_kin,
static inline для полей
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
25.04.2024, 19:38  [ТС]
получается типа такого
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
namespace test {
 
    static int var1 = 0;
    static void metod1() {
        var1++;
        std::cout << var1 << '\n';
 
    };
 
    class someClass2 {
    public:
        void someMethod() {
 
            metod1();
        }
 
    };
 
}
 
 
int main()
{
    test::someClass2 sc;
    sc.someMethod();
Добавлено через 17 секунд
Цитата Сообщение от sdf45 Посмотреть сообщение
static inline для полей
проверял -вроде без разницы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2024, 19:38

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
После бана на Пикабу не работает авторизация аккаунта с Яндекса.
Hrethgir 09.07.2026
В частности https:/ / auto. ru/ logbook/ zapret-na-vozhdenie-posle-65-let_1cf28789-07b4-4c75-a2f7-4cd4edf9deeb тут хотел оставить комментарий такой Зрите в корень - монополизация на разработку программ. . .
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 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru