|
const staic простыня из констант - boilerplate |
|
|
|
Aug 6 2018, 17:51
|
Группа: Участник
Сообщений: 12
Регистрация: 6-08-18
Пользователь №: 106 507
|
Ваш багаж знаний неужели кончился? Попрошу еще ответов не от Вас пожалуйста, слушать ваше детское "сам дурак мало били *надоело Цитата(Forger @ Aug 6 2018, 17:42) В данном (простейшем) случае достаточно добавить еще один enum, где будут указаны значения числа дней в каждом месяце. А потом следить за когерентностью энумов, особенно когда их за сотню? И вместо простого и понятного {jan,31} иметь два энума, в которых не дай бог что либо не по порядку пойдет. Не, на таком уровне я и define могу. А потом в исходную структуру добавится поле, указатель на уже реальную переменную, которую надо инитить в конструкторе, и мне вешаться с вашими энумами. Ясно все. Просто многословный язык. Кстати применения constexpr так и не привели. А вы всегда меняете исходные сообщения после того как вам ответили? Не знаете как создать константную расшаренную таблицу на все экземпляры и потомков, а советуете книжку почитать. Вы правда думаете, что вопрос от нечего делать? Рефакторю код одного му.. специалиста с энумами на 500 записей, 5 штук, все должны соответствовать друг другу. Непонтно чем он думал, видимо
Сообщение отредактировал С дуба рухнул - Aug 6 2018, 17:59
|
|
|
|
|
Aug 6 2018, 18:09
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Для подобной примитивной задачи мощь языка C++ со своими классами и наследования - как собаке пятая нога. Чтобы было понятно почему так, распишите хотя бы для себя как вы будете использовать весь это колхоз непосредственно в коде. Цитата(С дуба рухнул @ Aug 6 2018, 20:51) Не знаете как создать константную расшаренную таблицу на все экземпляры и потомков, Если знаете как это делать, то зачем тут пишите? Цитата а советуете книжку почитать. Не советую. Но если уж заговорили про книжки, то рекомендую эту. От нее горааааздо больше пользе, чем от той, который вы привели выше. Постараюсь еще раз, но в этот раз, учитывая обстоятельства, уже "на пальцах": Все данные, которые должны быть доступны ВНУТРИ класса, должны находится внутри класса и только внутри (под внутри имеется ввиду файл сpp). Если это - куча константных данных, то внутри соотв. cpp файла (const или constexpr), о чем я писал в самом начале. Доступ к этим данным должен осуществляться ЧЕРЕЗ соотв. методу, но напрямую - НИКОГДА. Размещать их внутри объявления класса - НЕПРАВИЛЬНО. И соотв. также неправильно давать возможность напрямую к ним обращаться извне класса. Вообще, объявление класса (соотв. файл hpp) должно иметь минимально возможный размер, иначе сильно ухудшается читаемость и сопровождение. Т.е. в идеале объявление классов должно состоять ТОЛЬКО из методов и private (реже protected) полей, которые, разумеется не могу быть const. Поля ни в коем случае НЕ ДОЛЖНЫ быть static.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Aug 6 2018, 18:11
|
Группа: Участник
Сообщений: 12
Регистрация: 6-08-18
Пользователь №: 106 507
|
Вы по существу семантики скажете когда нибудь что нибудь? Не надо мне о дизайне. Хотя если знаете что нибудь, напишите. А то продемонстрировать "я дартаньян, майкрософт дебилы" а в итоге уйти на общий треп "это не с++ это плохой дизайн, читал я банду четырех, не согласен со всеми четырьмя, колхоз " - это я сам могу. Пожалуйста, не отвечайте мне более, тем более вы меняете свои ответы задним числом, после возражений на них, это неприятно. "Доступ к этим данным должен осуществляться ЧЕРЕЗ соотв. методу, но напрямую - НИКОГДА." Вы просто начитались книжек. Для начала эти данные надо создать, причем я уже показал, вполне себе константно. Вы с вашими геттерами-сеттерами тут вообще мимо кассы
Сообщение отредактировал С дуба рухнул - Aug 6 2018, 18:14
|
|
|
|
|
Aug 6 2018, 18:20
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(С дуба рухнул @ Aug 6 2018, 21:11) Вы по существу семантики скажете когда нибудь что нибудь? Если выше был приведен гипотетический пример, то я объяснил, ЧТО ИМЕННО нужно делать. Читайте внимательнее. Если же это - конкретная задача и конкретный код, то все это реализуется БЕЗ классов и т.п. сложностей, присущих плюсам. и реализуется на базе банальной const struct. Цитата Для начала эти данные надо создать, причем я уже показал, вполне себе константно. Приведите КОНКРЕТНЫЙ пример, как это все будет применяться в коде. Именно исходя из этого и нужно решать задачу. И с этого и нужно было начинать! Цитата Вы просто начитались книжек. Вот именно поэтому я знаю, что внутри объявления класса нельзя создать const поле с конкретным значением, а вы - не знали. Но теперь знаете )) Но можно в объявлении класса вместо static const записать static constexpr и ошибок не будет. Вот только нет никакой объективной причины включать все эти нагромождения данных внутри объявления класса. Для этого просто создается соотв. метод, который будет возвращать нужные данные, а сами данные храняться внутри соотв. cpp файла в виде тех же const struct.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Aug 6 2018, 19:51
|
Группа: Участник
Сообщений: 12
Регистрация: 6-08-18
Пользователь №: 106 507
|
Цитата(Forger @ Aug 6 2018, 18:20) Вот именно поэтому я знаю, что внутри объявления класса нельзя создать const поле с конкретным значением, а вы - не знали. Но теперь знаете )) Код class T { private: const int m_i = 5; }; Не вопрос вообще. Теперь я знаю, что это Вы мало что знаете? Цитата(XVR @ Aug 6 2018, 18:56) Именно это вы и привели в самом первом сообщении. Что не устроило? Синтаксис и только. Подумал, что может есть что то типа with из Дельфи (выше писал) или как-то иначе. Код //header typedef enum { ACC_05, ACC_10 } eMeterAccuracy; template <class T> struct INFOTYPE { T type; string desc; bool isVer;// optional }; static const INFOTYPE <eMeterAccuracy> meterAccuracyInfo[]; // cpp
const CProduction::INFOTYPE <CProduction::eMeterAccuracy> CProduction::meterAccuracyInfo[] = { {ACC_05, "0.5"}, { ACC_10, "1.0" }, Какое - то нагромождение уточнения области CProduction:: каждый раз Нет чего нибудь навроде with CProduction { const INFOTYPE <eMeterAccuracy> meterAccuracyInfo[] = }; ? Или вообще других методов создания таких таблиц, не падая до дефайнов, непривязанному ни к какому классу кода и подобным вещам?
|
|
|
|
|
Aug 6 2018, 20:12
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(С дуба рухнул @ Aug 6 2018, 22:51) Код class T { private: const int m_i = 5; }; Не вопрос вообще. Теперь я знаю, что это Вы мало что знаете? По-ходу все же придется разжевать и положить в рот ... Итак, если не хотите, что этот m_i создавался в памяти для КАЖДОГО экземпляра этого класса, то нужно добавлять перед ним static. Да, конечно, static можно добавить перед "простыми" типами, это решает "проблему" с памятью: Код class Test1 { const int z = 10; };
class Test2 { static const int z = 10; };
sizeof (Test1) = 4 байт; sizeof (Test2) = 1 байт; Но этот static НЕЛЬЗЯ добавить перед типами, например, float или структурами Для тех кто не понял - речь идет про инициализацию полей класса прямо в объявлении класса.Код class Test1 { const float pi = 3.14; };
class Test2 { static const float pi = 3.14; };
class Test3 { static constexpr float pi = 3.14; };
sizeof (Test1) = 4 байт; sizeof (Test2) - error: in-class initializer for static data member of type 'const float' sizeof (Test3) = 1 байт; Все то же самое касается структур: Код struct Coord { int x; int y; };
class Test1 { const Coord coord = { 0, 1 }; };
class Test2 { static const Coord coord = { 0, 1 }; };
class Test3 { static constexpr Coord coord = { 0, 1 }; };
sizeof (Test1) = 8 байт; sizeof (Test2) - error: in-class initializer for static data member of type 'const Coord' sizeof (Test3) = 1 байт; Теперь понятно, зачем я упоминал в этой теме constexpr? Надеюсь, переварите это уже самостоятельно. Но повторюсь: по-мне не разумно тащить все это нагромождение констант через все объявление класса. "Толстые" константные структуры, текстовые константы, лучше скрывать внутри соотв. cpp файлов.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Aug 6 2018, 20:30
|
Группа: Участник
Сообщений: 12
Регистрация: 6-08-18
Пользователь №: 106 507
|
Непонятно. Я о инициализации структур писал. https://stackoverflow.com/questions/370283/...mber-in-a-class Пойду лучше на stackoverflow, там люди отвечают без наездов
Сообщение отредактировал С дуба рухнул - Aug 6 2018, 20:34
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|