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

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

// 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 не вариант

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

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


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

Как делаете?
С дуба рухнул, поясните, что именно "делаем"?

 

то все становится просто безумно малочитаемым
Нет причин беспокоится: в данном случае вы уже достигли "дна" :biggrin:

 

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


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

У меня в классе есть несколько 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)

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

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


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

Мне нужны константные пары, общие для всего класса, то бишь статики.

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

 

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

Если это принципиально "считать при компиляции", то на это есть шаблоны.

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

 

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

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

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


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

Я не спрашивал "зачем", я просил "как". MSDN говорит, что правильно все, нельзя not an integral type, use a member-definition statement.

 

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

 

 

Если это принципиально "считать при компиляции", то на это есть шаблоны.

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

 

 

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

Мне нужен static const. Да и даже начихав на расход памяти для дублежа на каждый экземпляр такого класса с не static членами - ничего не выйдет, структура это non integral тип, и так инициализировать ее нельзя. Будет уже https://docs.microsoft.com/en-us/previous-v...3ks1w(v=vs.120) cannot specify explicit initializer for arrays

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

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

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


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

Я не спрашивал "зачем", я просил "как".

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

 

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

Странно, а у меня это прекрасно получается ...

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

 

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

А я вот только сейчас увидел этот первый прямой вопрос. Ну, наверно, плохо читал ((

Ответ: посмотрите в сторону "constexpr"

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


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

Как использовать constexpr для таких целей

 

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

 

Или вот так:

static const pair_t pairs[] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

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

 

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

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


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

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

 

Или вот так:

static const pair_t pairs[] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

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

 

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

Вот пожалуйста https://msdn.microsoft.com/ru-ru/library/cz0a83sb.aspx

именованные режимы открытия файлов - статически константы класса, и если Вы считаете, что Майкрософту до Вас как до Луны - могу дать других примеров подобного рода, даже не посылая в гугл

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

Update - не, наврал, они enum нарисовали и ручками значения забили. ОК, поищу более похожее позднее

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

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

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


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

Майкрософту до Вас как до Луны

Где вы там увидели статические поля (члены данных)?

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:

Синглтон - это один из самых спорных паттернов. По сути, это некий костыль, и все из-за все того же static.

Его применение требует четкого понимания, как он работает.

Я давно от него отказался, хотя, признаюсь, раньше частенько им "грешил" ;)

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


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

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

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

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


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

 

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

Достаточно было в самом начале написать, что ИМЕННО вам нужно. Телепатов не существует - это миф.

Код в начале топика можно упростить, только полностью переписав. Ибо то, что вы привели, может понять только один лишь его автор.

 

Короче, если вам не нравится 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 день, но непонятно.

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

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


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

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