|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|||||||||||
Статический класс25.04.2024, 04:02. Показов 11027. Ответов 165
Метки нет (Все метки)
Всем привет
хочу создать полностью статический класс и создаю но возникают ошибки неопределенные reference и пр. хотелось бы сделать так
пишу в итоге так
при компиляции получаю ошибки необъявленные ссылки на var1, var2 .... undefined reference to `SomeClass::var1 вопрос как объявить статический метод класса, а в идеале и вообще весь класс, чтобы не создавать в коде его экземпляр? Добавлено через 4 минуты основная задача вынести этот статический класс в один файл то бишь в модуль не хедер + cpp а сразу все в одном как в шарпах - очень удобно это они придумали в шарпах
0
|
|||||||||||
| 25.04.2024, 04:02 | |
|
Ответы с готовыми решениями:
165
Дан класс, преобразуйте его в статический класс со статическими методами и продемонстрируйте работу с ним Статический класс Статический член указатель на класс |
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||
| 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
|
||||||||||||
|
фрилансер
6498 / 5729 / 1133
Регистрация: 11.10.2019
Сообщений: 15,303
|
||
| 08.05.2024, 05:19 | ||
|
pup_kin, глобальные и статические переменные и статические поля инициализируются принудительно пустым инициализатором
{}, даже если его не указатьinline static type field;
0
|
||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||||||
| 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
|
|||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||
| 08.05.2024, 12:44 | ||
|
pup_kin,
Если нужна куча, то нужно создавать переменные с другим классом хранения - динамическим.
0
|
||
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|||||||
| 08.05.2024, 12:55 [ТС] | |||||||
|
когда пишем
т.е. это просто атавизм такой? что вот надо всегда если не пишем inline инициализировать вручную вне класса
0
|
|||||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||
| 08.05.2024, 13:03 | |||
![]() Не инициализировать, а определять. То, что у определения может быть инициализация - это свойство самого определения: инициализация делается у определения, не важно явная она или неявная.
0
|
|||
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|
| 08.05.2024, 23:26 [ТС] | |
|
есть объявление и определение.
инициализация - это что-то третье? видимо терминология не та
0
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|
| 08.05.2024, 23:28 | |
|
pup_kin, inline переменные и ошибка undefined reference, которым посвящены последние страницы этой темы никак не относятся к инициализации. Не понятно зачем ее вообще здесь упоминать.
0
|
|
|
фрилансер
6498 / 5729 / 1133
Регистрация: 11.10.2019
Сообщений: 15,303
|
|
| 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,312
|
|||||
| 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
|
||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||
| 10.05.2024, 11:07 | |||
|
Если уж и хотите что-то запомнить без понимания, то запомните это. Добавлено через 4 минуты Я говорил лишь о том, что поведение статических переменных класса в части отсутствия их неявной инлайновости как (у функций) обсусловлено историческими причинами. Все остальное, что здесь обсуждалось, можно и нужно понимать, без попыток свалить на то, что DrOffset сказал, что в этом можно не разбираться. Я такого не говорил.
0
|
|||
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|||||||
| 10.05.2024, 14:18 [ТС] | |||||||
|
НО , оно даже в ардуино ИДЕ нормально компилируется
компиляторы ардуины и вижуал студио не ругаются
0
|
|||||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||
| 10.05.2024, 14:45 | ||
|
Вы же совсем другой пример показывали выше и ответ TheCalligrapher был о нем. Ваш текщий пример не про определения вовсе, он про порядок инициализации.
0
|
||
| 10.05.2024, 14:45 | |
|
Не могу вызвать простой статический класс Статический полиморфизм. Базовый класс «прямоугольник» Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже --> создать статический массив строк как статический массив указателей на строки, задание ниже --> Объясните человеческим языком мне чайнику что такое singleton, статический класс. Зачем они нужны. Что рекомендуете прочитать мне для начала Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|