|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|||||||||||
Статический класс25.04.2024, 04:02. Показов 10747. Ответов 165
Метки нет (Все метки)
Всем привет
хочу создать полностью статический класс и создаю но возникают ошибки неопределенные reference и пр. хотелось бы сделать так
пишу в итоге так
при компиляции получаю ошибки необъявленные ссылки на var1, var2 .... undefined reference to `SomeClass::var1 вопрос как объявить статический метод класса, а в идеале и вообще весь класс, чтобы не создавать в коде его экземпляр? Добавлено через 4 минуты основная задача вынести этот статический класс в один файл то бишь в модуль не хедер + cpp а сразу все в одном как в шарпах - очень удобно это они придумали в шарпах
0
|
|||||||||||
| 25.04.2024, 04:02 | |
|
Ответы с готовыми решениями:
165
Дан класс, преобразуйте его в статический класс со статическими методами и продемонстрируйте работу с ним Статический класс Статический член указатель на класс |
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||
| 07.05.2024, 20:23 | |||
|
Это все равно что спрашивать почему у кошки есть хвост, а у вас нет. Потому что так сложились обстоятельства. Принцип сборки в C# - другой. Те проблемы, которые возникают при использовании Си-шного линкера с С++ в C# просто отсутствуют как класс. Добавлено через 8 минут А не даст он по сугубо историческим причинам, которые сейчас изменить уже никак нельзя. Корень кроется в двух аспектах: 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
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||
| 07.05.2024, 21:43 | ||
|
В любом случае нет никаких гарантий какой статический объект создастся первым. Из за этого, все такие проблемы С++ не решает вообще А на другое он создает 20+ 23+ 26+ огромное количество хуеты которое никому не всралось.
1
|
||
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
||||||||||||
| 08.05.2024, 00:43 [ТС] | ||||||||||||
|
вот без проблем сделал, даже однофайловый проект оно не отслеживает что член неинициализован. но при этом ругается когда я его инициализую внутри класса.
при этом ошибок нет, и она чудом равна нулю - значит она инициализована значением по умолчанию, для типа - если такое есть, наверное такого не должно быть в с++. я не вижу никаких причин кроме исторических в недопустимости определения внутри класса. Добавлено через 13 минут но стоит закомментить
это поведение вообще непонятно.
0
|
||||||||||||
|
фрилансер
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
|
||
| 08.05.2024, 05:19 | ||
|
pup_kin, глобальные и статические переменные и статические поля инициализируются принудительно пустым инициализатором
{}, даже если его не указатьinline static type field;
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||
| 08.05.2024, 09:29 | ||||||
|
Проблема остается только если один статический объект начинает использовать другой, причем в разных единицах трансляции. Однако это достаточно редко происходит при аккуратном программировании. А если и происходит, то синглтон решает эту проблему. Впрочем это все почти никак не относится к обсуждаемому вопросу (на данный момент). Давайте придерживаться контекста темы. Инициализация и storage - это ортогональные понятия. Он вам стал говорить про инициализацию (про ее порядок), а мы с вами выше вели речь про storage. Добавлено через 3 минуты Добавлено через 1 минуту И запомнить, что инициализация не имеет отношения к этому вопросу. "Ругается" не потому, что нет инициализации, а потому что нет storage (т.е. адресуемого места в памяти, которое создается при определении переменной).
0
|
||||||
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
||||||||
| 08.05.2024, 11:29 [ТС] | ||||||||
|
какой смысл в инициализации статической переменной, например пустым значением - если использовать ее без storage нет возможности. Я мне кажется это лишнее действие. Или такая возможность есть, разумеется не определяя ее inline. я так понял есть логическая дырка, и стоит просто принять как данность исторически сложившуюся или как-то иначе.
а что мешает также по умолчанию и выделить storage для переменных точно также как и инициализация значением по умолчанию. Я могу как-то повлиять и например выделить storage для BB::var1 в разных местах ? т.е. могу ли я управлять тем где будет находиться значение переменной в куче, в стеке, еще -где-то ? Добавлено через 52 секунды ![]() да даже в 1с перечитывая открываешь новое
0
|
||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||
| 08.05.2024, 11:57 | |||
|
Нет storage - нет инициализации, её просто на над чем проделать. Но при этом же даже не соберётся, так что уже не важно что там с инициализацией. А если есть storage - то есть и инициализация. Но тогда о чем вопрос? Добавлено через 1 минуту
1
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 08.05.2024, 12:44 | ||
|
pup_kin,
Если нужна куча, то нужно создавать переменные с другим классом хранения - динамическим.
0
|
||
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|||||||
| 08.05.2024, 12:55 [ТС] | |||||||
|
когда пишем
т.е. это просто атавизм такой? что вот надо всегда если не пишем inline инициализировать вручную вне класса
0
|
|||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||
| 08.05.2024, 13:03 | |||
![]() Не инициализировать, а определять. То, что у определения может быть инициализация - это свойство самого определения: инициализация делается у определения, не важно явная она или неявная.
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
|
|
|
фрилансер
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 [ТС] | |||||||
|
когда я пишу
скажет undefined reference. т.е. для полей и для методов разное поведение. это просто надо запомнить
0
|
|||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|||||
| 10.05.2024, 03:43 | |||||
A::var1 у вас не определена. Будет ошибка undefined reference.
0
|
|||||
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
||
| 10.05.2024, 10:31 [ТС] | ||
|
Но, однако, прекрасно компилируется и работает, и значение A::var1 равно 0. визуал студио, стандарт 14 кажется -минимальный в котором сработал пример со static inline. всем спасибо. я так понял что это просто исторически так сложилось. как DrOffset и писал , и понять это не имеет смысла.
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||
| 10.05.2024, 11:07 | |||
|
Если уж и хотите что-то запомнить без понимания, то запомните это. Добавлено через 4 минуты Я говорил лишь о том, что поведение статических переменных класса в части отсутствия их неявной инлайновости как (у функций) обсусловлено историческими причинами. Все остальное, что здесь обсуждалось, можно и нужно понимать, без попыток свалить на то, что DrOffset сказал, что в этом можно не разбираться. Я такого не говорил.
0
|
|||
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|||||||
| 10.05.2024, 14:18 [ТС] | |||||||
|
НО , оно даже в ардуино ИДЕ нормально компилируется
компиляторы ардуины и вижуал студио не ругаются
0
|
|||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 10.05.2024, 14:45 | ||
|
Вы же совсем другой пример показывали выше и ответ TheCalligrapher был о нем. Ваш текщий пример не про определения вовсе, он про порядок инициализации.
0
|
||
| 10.05.2024, 14:45 | |
|
Не могу вызвать простой статический класс Статический полиморфизм. Базовый класс «прямоугольник» Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже --> создать статический массив строк как статический массив указателей на строки, задание ниже --> Объясните человеческим языком мне чайнику что такое singleton, статический класс. Зачем они нужны. Что рекомендуете прочитать мне для начала Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|