Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: const staic простыня из констант - boilerplate
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
С дуба рухнул
Код
// h file
class CViewXXX
{
....
struct frame_cntrl_pairT
  {
      int idOnline; //
      int idSetup; //
  };

static const frame_cntrl_pairT m_onlineData[];
};
//cpp file
const CViewXXX::frame_cntrl_pairT CViewXXX::m_onlineData[] = {
{1,2},
{3,4},
{5,6},
};

Многовато для такой мелочи. Если же типы в frame_cntrl_pairT не int, а , например, шаблонные типы, то все становится просто безумно малочитаемым. Как делаете? define не вариант
Forger
Цитата(С дуба рухнул @ Aug 6 2018, 14:08) *
Как делаете?
С дуба рухнул, поясните, что именно "делаем"?

Цитата
то все становится просто безумно малочитаемым
Нет причин беспокоится: в данном случае вы уже достигли "дна" biggrin.gif
С дуба рухнул
У меня в классе есть несколько windows control. У них у всех есть свой ID. Контролы попарно связаны, их кол-во тоже хардкодить не очень хочется. Вот совсем если просто в Си
Код
    typedef struct  
    {
        int a;
        int b;
    } pair_t;
    pair_t pairs[] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
    for (int i = 0; i < sizeof(pairs) / sizeof(pairs[0]); i++)
       // some stuff

Так делают многие, это нормально читается. В плюсах хочу иметь тоже самое. Как не "хуже уже точно" сделать?
Мне нужны константные пары, общие для всего класса, то бишь статики. Ничего в конструкторы пихать не надо, все считается при компиляции. Если Вы "не дно" то предложите как надо. Пары должны быть в пространстве имен класса, define в садик.

Вот такие вот ошибки https://docs.microsoft.com/en-us/previous-v...kb76w(v=vs.120)
Forger
Цитата
Мне нужны константные пары, общие для всего класса, то бишь статики.

Первое, что нужно сделать под плюсами, убрать нафик статики.

Цитата
Ничего в конструкторы пихать не надо, все считается при компиляции.

Если это принципиально "считать при компиляции", то на это есть шаблоны.
Я использую базовые абстактные классы с основным фукционалом, а от них уже наследую шаблонные классы с нужными изменяемыми параметрами, которые считаются, как вы хотите, "при компиляции".

Цитата
Пары должны быть в пространстве имен класса.

Еще раз - удалить static, тут он костыль, который попьет еще немало крови.
С дуба рухнул
Я не спрашивал "зачем", я просил "как". MSDN говорит, что правильно все, нельзя not an integral type, use a member-definition statement.

Цитата(Forger @ Aug 6 2018, 15:27) *
Первое, что нужно сделать под плюсами, убрать нафик статики.


Если это принципиально "считать при компиляции", то на это есть шаблоны.
Я использую базовые абстактные классы с основным фукционалом, а от них уже наследую шаблонные классы с нужными изменяемыми параметрами, которые считаются, как вы хотите, "при компиляции".


Еще раз - удалить static, тут он костыль, который попьет еще немало крови.

Мне нужен static const. Да и даже начихав на расход памяти для дублежа на каждый экземпляр такого класса с не static членами - ничего не выйдет, структура это non integral тип, и так инициализировать ее нельзя. Будет уже https://docs.microsoft.com/en-us/previous-v...3ks1w(v=vs.120) cannot specify explicit initializer for arrays
Причем тут шаблонные классы вообще? Вопрос был как проиниициализровать статическую константную структуру всего лишь
Forger
Цитата(С дуба рухнул @ Aug 6 2018, 17:40) *
Я не спрашивал "зачем", я просил "как".

В таком случае ответ будет только один: остаться на голом С, забыть про плюсы, и слушаться MSDN, ведь "MSDN говорит, что правильно все". biggrin.gif

Цитата
Да и даже начихав на расход памяти для дублежа на каждый экземпляр такого класса с не static членами - ничего не выйдет,

Странно, а у меня это прекрасно получается ...
Но раз, Вы так говорите что "ничего не выйдет", то действительно - у Вас ничего и не выйдет

Цитата
Вопрос был как проиниициализровать статическую константную структуру всего лишь

А я вот только сейчас увидел этот первый прямой вопрос. Ну, наверно, плохо читал ((
Ответ: посмотрите в сторону "constexpr"
С дуба рухнул
Можно пример того, что требуется привести?
Forger
Цитата(С дуба рухнул @ Aug 6 2018, 17:52) *
Можно пример того, что требуется привести?

???


С дуба рухнул
Как использовать constexpr для таких целей
Forger
Цитата(С дуба рухнул @ Aug 6 2018, 17:59) *
Как использовать constexpr для таких целей


Для начала почитать, что это вообще такое. Гугль в помощь.

Или вот так:
Код
static const pair_t pairs[] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

Прямо внутри файла cpp делайте это.

А внутри объявления класса это, разумеется, делать нельзя: static переменные (поля) внутри объявления класса - это лютая дичь, за которую нужно бить по рукам еще в детстве krapula.gif
С дуба рухнул
Цитата(Forger @ Aug 6 2018, 16:04) *
Для начала почитать, что это вообще такое. Гугль в помощь.

Или вот так:
Код
static const pair_t pairs[] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

Прямо внутри файла cpp делайте это.

А внутри объявления класса это, разумеется, делать нельзя: static переменные (поля) внутри объявления класса - это лютая дичь, за которую нужно бить по рукам еще в детстве krapula.gif

Вот пожалуйста https://msdn.microsoft.com/ru-ru/library/cz0a83sb.aspx
именованные режимы открытия файлов - статически константы класса, и если Вы считаете, что Майкрософту до Вас как до Луны - могу дать других примеров подобного рода, даже не посылая в гугл
И да, я погуглил, увы. Может натолкнете , как constexpr позволит создать статические инициализированные константные по-сути своей таблицы?
Update - не, наврал, они enum нарисовали и ручками значения забили. ОК, поищу более похожее позднее
И да, Мейерса тоже не били? https://habr.com/post/147373/
Forger
Цитата(С дуба рухнул @ Aug 6 2018, 18:09) *
Майкрософту до Вас как до Луны

Где вы там увидели статические поля (члены данных)?
https://msdn.microsoft.com/ru-ru/library/60fh2b6f.aspx

Цитата
Может натолкнете , как constexpr позволит создать статические инициализированные константные по-сути своей таблицы?

Еще раз для тех, кто "в танке":
Прямо внутри файла cpp делайте это: static const pair_t pairs[] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
И забудьте уже наконец про объявление статических полей внутри класса!
Максимум - статический метод, и то в самом крайнем случае!
И не забывайте про enum, который как раз и объявляется внутри класса, чтобы снаружи был виден владельцам этого класса.

Цитата
И да, Мейерса тоже не били? https://habr.com/post/147373/

Вы хоть читайте ссылки, которые сами же и даете biggrin.gif
Синглтон - это один из самых спорных паттернов. По сути, это некий костыль, и все из-за все того же static.
Его применение требует четкого понимания, как он работает.
Я давно от него отказался, хотя, признаюсь, раньше частенько им "грешил" wink.gif
С дуба рухнул
Чем тут помогло и где оно constexpr? Вы нарисовали Сишный вариант, что я уже рисовал выше. Так и до define дойдем. В cpp файле совершенно необязательно реализация одного класса, и код такой засоряет. В Дельфи есть with http://www.delphisources.ru/pages/faq/faq_...s/With.php.html , в срр такого, как я понял нет. Правда неуверен, что в Дельфи он сможет сделать абсолютно то, что хотел, но направление именно такое хотел. И пожалуйста, не надо выкладывать тут весь свой огромный багаж знаний, сторожить некому. Достаточно написать было "код в начале топике упростить нельзя.
Forger

Цитата(С дуба рухнул)
Достаточно написать было "код в начале топике упростить нельзя.

Достаточно было в самом начале написать, что ИМЕННО вам нужно. Телепатов не существует - это миф.
Код в начале топика можно упростить, только полностью переписав. Ибо то, что вы привели, может понять только один лишь его автор.

Короче, если вам не нравится constexpr, то используйте enum. Он есть даже в голом си.
С дуба рухнул
Код
class baseCalendar
{
    protected:
    enum class monthT {jan, feb, march, april};
    
    struct monthInfo {
        monthT month;
        int daysCnt;  
    };
    static const monthInfo m_monthInfo[];
};
const baseCalendar::monthInfo baseCalendar::m_monthInfo[] = {
    {baseCalendar::monthT::jan, 31},
    {baseCalendar::monthT::feb, 28},
    {baseCalendar::monthT::jan, 31},
        {baseCalendar::monthT::april, 30},
};

class CRussianCalendar : public baseCalendar
{
    // а тут мне нужны константы, данные в базовом классе, а точнее m_monthInfo, так вот мне интересно, что предлагают гуру под словами "переписать все. ты дно. юзай constexpr. ". Они ж в другом файле по советам советчиков, а путин сказал, что мало работаем, в феврале 35 дней будет. Мне теперь всех наследников переписывать?  Или заниматься субклассированием сущностей с одной идиотской целью поменять константы?
    
};

Подскажите, что и как переписать, я начинающий, вчера книгу купил с++ за 21 день, но непонятно.
Forger
Цитата(С дуба рухнул @ Aug 6 2018, 20:39) *
я начинающий, вчера книгу купил с++ за 21 день

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


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

Цитата(Forger @ Aug 6 2018, 17:42) *
В данном (простейшем) случае достаточно добавить еще один enum, где будут указаны значения числа дней в каждом месяце.

А потом следить за когерентностью энумов, особенно когда их за сотню? И вместо простого и понятного {jan,31} иметь два энума, в которых не дай бог что либо не по порядку пойдет. Не, на таком уровне я и define могу. А потом в исходную структуру добавится поле, указатель на уже реальную переменную, которую надо инитить в конструкторе, и мне вешаться с вашими энумами. Ясно все. Просто многословный язык. Кстати применения constexpr так и не привели.
А вы всегда меняете исходные сообщения после того как вам ответили? Не знаете как создать константную расшаренную таблицу на все экземпляры и потомков, а советуете книжку почитать. Вы правда думаете, что вопрос от нечего делать? Рефакторю код одного му.. специалиста с энумами на 500 записей, 5 штук, все должны соответствовать друг другу. Непонтно чем он думал, видимо
Forger
Для подобной примитивной задачи мощь языка C++ со своими классами и наследования - как собаке пятая нога.

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


Цитата(С дуба рухнул @ Aug 6 2018, 20:51) *
Не знаете как создать константную расшаренную таблицу на все экземпляры и потомков,

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

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

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


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

Все данные, которые должны быть доступны ВНУТРИ класса, должны находится внутри класса и только внутри (под внутри имеется ввиду файл сpp).
Если это - куча константных данных, то внутри соотв. cpp файла (const или constexpr), о чем я писал в самом начале.
Доступ к этим данным должен осуществляться ЧЕРЕЗ соотв. методу, но напрямую - НИКОГДА.
Размещать их внутри объявления класса - НЕПРАВИЛЬНО. И соотв. также неправильно давать возможность напрямую к ним обращаться извне класса.
Вообще, объявление класса (соотв. файл hpp) должно иметь минимально возможный размер, иначе сильно ухудшается читаемость и сопровождение.
Т.е. в идеале объявление классов должно состоять ТОЛЬКО из методов и private (реже protected) полей, которые, разумеется не могу быть const.
Поля ни в коем случае НЕ ДОЛЖНЫ быть static.
С дуба рухнул
Вы по существу семантики скажете когда нибудь что нибудь? Не надо мне о дизайне. Хотя если знаете что нибудь, напишите. А то продемонстрировать "я дартаньян, майкрософт дебилы" а в итоге уйти на общий треп "это не с++ это плохой дизайн, читал я банду четырех, не согласен со всеми четырьмя, колхоз " - это я сам могу. Пожалуйста, не отвечайте мне более, тем более вы меняете свои ответы задним числом, после возражений на них, это неприятно. "Доступ к этим данным должен осуществляться ЧЕРЕЗ соотв. методу, но напрямую - НИКОГДА." Вы просто начитались книжек. Для начала эти данные надо создать, причем я уже показал, вполне себе константно. Вы с вашими геттерами-сеттерами тут вообще мимо кассы
Forger
Цитата(С дуба рухнул @ Aug 6 2018, 21:11) *
Вы по существу семантики скажете когда нибудь что нибудь?

Если выше был приведен гипотетический пример, то я объяснил, ЧТО ИМЕННО нужно делать. Читайте внимательнее.
Если же это - конкретная задача и конкретный код, то все это реализуется БЕЗ классов и т.п. сложностей, присущих плюсам. и реализуется на базе банальной const struct.

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

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

Цитата
Вы просто начитались книжек.
Вот именно поэтому я знаю, что внутри объявления класса нельзя создать const поле с конкретным значением, а вы - не знали. Но теперь знаете ))
Но можно в объявлении класса вместо static const записатьstatic constexpr и ошибок не будет. Вот только нет никакой объективной причины включать все эти нагромождения данных внутри объявления класса.
Для этого просто создается соотв. метод, который будет возвращать нужные данные, а сами данные храняться внутри соотв. cpp файла в виде тех же const struct.
XVR
Цитата(С дуба рухнул @ Aug 6 2018, 17:25) *
Мне нужны константные пары, общие для всего класса, то бишь статики. Ничего в конструкторы пихать не надо, все считается при компиляции.
Именно это вы и привели в самом первом сообщении. Что не устроило?

С дуба рухнул
Цитата(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[] =
};
? Или вообще других методов создания таких таблиц, не падая до дефайнов, непривязанному ни к какому классу кода и подобным вещам?
Forger
Цитата(С дуба рухнул @ 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 файлов.
С дуба рухнул
Непонятно. Я о инициализации структур писал.
https://stackoverflow.com/questions/370283/...mber-in-a-class Пойду лучше на stackoverflow, там люди отвечают без наездов
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.