Перейти к содержанию
    

const staic простыня из констант - boilerplate

я начинающий, вчера книгу купил с++ за 21 день

Отписаться тут через 21 день, минимум.

 

 

В данном (простейшем) случае достаточно добавить еще один enum, где будут указаны значения числа дней в каждом месяце

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

В данном (простейшем) случае достаточно добавить еще один enum, где будут указаны значения числа дней в каждом месяце.

А потом следить за когерентностью энумов, особенно когда их за сотню? И вместо простого и понятного {jan,31} иметь два энума, в которых не дай бог что либо не по порядку пойдет. Не, на таком уровне я и define могу. А потом в исходную структуру добавится поле, указатель на уже реальную переменную, которую надо инитить в конструкторе, и мне вешаться с вашими энумами. Ясно все. Просто многословный язык. Кстати применения constexpr так и не привели.

А вы всегда меняете исходные сообщения после того как вам ответили? Не знаете как создать константную расшаренную таблицу на все экземпляры и потомков, а советуете книжку почитать. Вы правда думаете, что вопрос от нечего делать? Рефакторю код одного му.. специалиста с энумами на 500 записей, 5 штук, все должны соответствовать друг другу. Непонтно чем он думал, видимо

Изменено пользователем С дуба рухнул

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для подобной примитивной задачи мощь языка C++ со своими классами и наследования - как собаке пятая нога.

 

Чтобы было понятно почему так, распишите хотя бы для себя как вы будете использовать весь это колхоз непосредственно в коде.

 

 

Не знаете как создать константную расшаренную таблицу на все экземпляры и потомков,

Если знаете как это делать, то зачем тут пишите?

 

а советуете книжку почитать.

Не советую. Но если уж заговорили про книжки, то рекомендую эту.

От нее горааааздо больше пользе, чем от той, который вы привели выше.

 

 

Постараюсь еще раз, но в этот раз, учитывая обстоятельства, уже "на пальцах":

 

Все данные, которые должны быть доступны ВНУТРИ класса, должны находится внутри класса и только внутри (под внутри имеется ввиду файл сpp).

Если это - куча константных данных, то внутри соотв. cpp файла (const или constexpr), о чем я писал в самом начале.

Доступ к этим данным должен осуществляться ЧЕРЕЗ соотв. методу, но напрямую - НИКОГДА.

Размещать их внутри объявления класса - НЕПРАВИЛЬНО. И соотв. также неправильно давать возможность напрямую к ним обращаться извне класса.

Вообще, объявление класса (соотв. файл hpp) должно иметь минимально возможный размер, иначе сильно ухудшается читаемость и сопровождение.

Т.е. в идеале объявление классов должно состоять ТОЛЬКО из методов и private (реже protected) полей, которые, разумеется не могу быть const.

Поля ни в коем случае НЕ ДОЛЖНЫ быть static.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы по существу семантики скажете когда нибудь что нибудь? Не надо мне о дизайне. Хотя если знаете что нибудь, напишите. А то продемонстрировать "я дартаньян, майкрософт дебилы" а в итоге уйти на общий треп "это не с++ это плохой дизайн, читал я банду четырех, не согласен со всеми четырьмя, колхоз " - это я сам могу. Пожалуйста, не отвечайте мне более, тем более вы меняете свои ответы задним числом, после возражений на них, это неприятно. "Доступ к этим данным должен осуществляться ЧЕРЕЗ соотв. методу, но напрямую - НИКОГДА." Вы просто начитались книжек. Для начала эти данные надо создать, причем я уже показал, вполне себе константно. Вы с вашими геттерами-сеттерами тут вообще мимо кассы

Изменено пользователем С дуба рухнул

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы по существу семантики скажете когда нибудь что нибудь?

Если выше был приведен гипотетический пример, то я объяснил, ЧТО ИМЕННО нужно делать. Читайте внимательнее.

Если же это - конкретная задача и конкретный код, то все это реализуется БЕЗ классов и т.п. сложностей, присущих плюсам. и реализуется на базе банальной const struct.

 

Для начала эти данные надо создать, причем я уже показал, вполне себе константно.

Приведите КОНКРЕТНЫЙ пример, как это все будет применяться в коде. Именно исходя из этого и нужно решать задачу. И с этого и нужно было начинать!

 

Вы просто начитались книжек.
Вот именно поэтому я знаю, что внутри объявления класса нельзя создать const поле с конкретным значением, а вы - не знали. Но теперь знаете ))

Но можно в объявлении класса вместо static const записатьstatic constexpr и ошибок не будет. Вот только нет никакой объективной причины включать все эти нагромождения данных внутри объявления класса.

Для этого просто создается соотв. метод, который будет возвращать нужные данные, а сами данные храняться внутри соотв. cpp файла в виде тех же const struct.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне нужны константные пары, общие для всего класса, то бишь статики. Ничего в конструкторы пихать не надо, все считается при компиляции.
Именно это вы и привели в самом первом сообщении. Что не устроило?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот именно поэтому я знаю, что внутри объявления класса нельзя создать const поле с конкретным значением, а вы - не знали. Но теперь знаете ))

class T
{
private:
    const int m_i = 5;
};

Не вопрос вообще. Теперь я знаю, что это Вы мало что знаете?

 

Именно это вы и привели в самом первом сообщении. Что не устроило?

Синтаксис и только. Подумал, что может есть что то типа 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[] =

};

? Или вообще других методов создания таких таблиц, не падая до дефайнов, непривязанному ни к какому классу кода и подобным вещам?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 файлов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Непонятно. Я о инициализации структур писал.

https://stackoverflow.com/questions/370283/...mber-in-a-class Пойду лучше на stackoverflow, там люди отвечают без наездов

Изменено пользователем С дуба рухнул

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...