|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|||||||||||
Статический класс25.04.2024, 04:02. Показов 11763. Ответов 165
Метки нет (Все метки)
Всем привет
хочу создать полностью статический класс и создаю но возникают ошибки неопределенные reference и пр. хотелось бы сделать так
пишу в итоге так
при компиляции получаю ошибки необъявленные ссылки на var1, var2 .... undefined reference to `SomeClass::var1 вопрос как объявить статический метод класса, а в идеале и вообще весь класс, чтобы не создавать в коде его экземпляр? Добавлено через 4 минуты основная задача вынести этот статический класс в один файл то бишь в модуль не хедер + cpp а сразу все в одном как в шарпах - очень удобно это они придумали в шарпах
0
|
|||||||||||
| 25.04.2024, 04:02 | |
|
Ответы с готовыми решениями:
165
Дан класс, преобразуйте его в статический класс со статическими методами и продемонстрируйте работу с ним Статический класс Статический член указатель на класс |
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 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
|
||||||||||||
|
фрилансер
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
|
||
| 08.05.2024, 05:19 | ||
|
pup_kin, глобальные и статические переменные и статические поля инициализируются принудительно пустым инициализатором
{}, даже если его не указатьinline static type field;
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||||
| 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
|
|||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 08.05.2024, 12:44 | ||
|
pup_kin,
Если нужна куча, то нужно создавать переменные с другим классом хранения - динамическим.
0
|
||
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|||||||
| 08.05.2024, 12:55 [ТС] | |||||||
|
когда пишем
т.е. это просто атавизм такой? что вот надо всегда если не пишем inline инициализировать вручную вне класса
0
|
|||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 08.05.2024, 13:03 | |||
![]() Не инициализировать, а определять. То, что у определения может быть инициализация - это свойство самого определения: инициализация делается у определения, не важно явная она или неявная.
0
|
|||
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|
| 08.05.2024, 23:26 [ТС] | |
|
есть объявление и определение.
инициализация - это что-то третье? видимо терминология не та
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 08.05.2024, 23:28 | |
|
pup_kin, inline переменные и ошибка undefined reference, которым посвящены последние страницы этой темы никак не относятся к инициализации. Не понятно зачем ее вообще здесь упоминать.
0
|
|
|
фрилансер
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
|
|
| 09.05.2024, 05:38 | |
|
pup_kin, инициализация - это самое первое заполнение содержимого объекта чем-либо.
0
|
|
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|||||||
| 10.05.2024, 00:14 [ТС] | |||||||
|
когда я пишу
скажет undefined reference. т.е. для полей и для методов разное поведение. это просто надо запомнить
0
|
|||||||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
|||||
| 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
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 10.05.2024, 11:07 | |||
|
Если уж и хотите что-то запомнить без понимания, то запомните это. Добавлено через 4 минуты Я говорил лишь о том, что поведение статических переменных класса в части отсутствия их неявной инлайновости как (у функций) обсусловлено историческими причинами. Все остальное, что здесь обсуждалось, можно и нужно понимать, без попыток свалить на то, что DrOffset сказал, что в этом можно не разбираться. Я такого не говорил.
0
|
|||
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|||||||
| 10.05.2024, 14:18 [ТС] | |||||||
|
НО , оно даже в ардуино ИДЕ нормально компилируется
компиляторы ардуины и вижуал студио не ругаются
0
|
|||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 10.05.2024, 14:45 | ||
|
Вы же совсем другой пример показывали выше и ответ TheCalligrapher был о нем. Ваш текщий пример не про определения вовсе, он про порядок инициализации.
0
|
||
| 10.05.2024, 14:45 | |
|
Не могу вызвать простой статический класс Статический полиморфизм. Базовый класс «прямоугольник» Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже --> создать статический массив строк как статический массив указателей на строки, задание ниже --> Объясните человеческим языком мне чайнику что такое singleton, статический класс. Зачем они нужны. Что рекомендуете прочитать мне для начала Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|