Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пара вопросов про массив хэндлеров, и инициализацию структуры нулевыми знач. 
:(
    Опции темы
azesmcar
Дата 30.4.2010, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(SABROG @  30.4.2010,  16:58 Найти цитируемый пост)
Так чтоль?

почти

Цитата(SABROG @  30.4.2010,  16:58 Найти цитируемый пост)
class MyClass {
public:
    int var1;
};

это POD структура, все нормально.

Цитата(SABROG @  30.4.2010,  16:58 Найти цитируемый пост)
class MyClass {
    int var1;
};

это не POD структура и не агрегат, поскольку агрегатом является класс/структура/юнион, не имеющий нестатических private или protected членов (и еще куча всяких "если"), а POD структура является агрегатом, которая к тому же имеет еще несколько условий.
Инициализацию типа
Код

MyStruct t = {0};

можно применять к агрегатам (ну и соответственно к POD структурам), а default initialization работает только на POD структурах, т.е. к примеру если мы напишем деструктор
Код

class MyStruct
{
public:
    ~MyStruct(){}
    int a;
    int b;
    int c;
};

этот код уже инициализировать нулями не будет
Код

MyStruct t = MyStruct();

зато этот - будет, так как структура все еще является агрегатом.
Код

MyStruct t = {0};


Добавлено через 1 минуту и 51 секунду
Цитата(SABROG @  30.4.2010,  16:58 Найти цитируемый пост)
void foo(MyClass mc = MyClass()) // проблема?
---
class MyClass {
    int var1'
public:
    int var2;
};
void foo(MyClass mc = MyClass()) // var2 инициализирована нулем, var1 - undefined

а тут поскольку MyClass не POD структура - default инициализация работать не будет, это значит что не будет работать совсем и оба члена останутся не инициализированными.

Добавлено через 8 минут и 20 секунд
Цитата(SABROG @  30.4.2010,  16:58 Найти цитируемый пост)
Я уже путаюсь о чем вы меня спрашиваете. 

я хочу понять задачу целиком, так как мы сейчас говорим о решении локальной проблемы инициализации структур, в то время как возможно это на самом деле и не нужно и задачу можно решить как-то иначе.
PM   Вверх
mes
Дата 30.4.2010, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SABROG @  30.4.2010,  15:39 Найти цитируемый пост)
Если брать вопрос про инициализацию структуры нулевыми значениями, 

Так это Вы знаете, что у Вас имеется, а нам даете кучу  Ваших размышлений и почти никакой сути задачи.


Цитата(SABROG @  30.4.2010,  15:39 Найти цитируемый пост)
Функция библиотеки (не моей) принимает в качестве аргумента структуру в которой нужно передать 4 указателя на обычные статические функции.

уже хоть что то..  

Цитата(SABROG @  30.4.2010,  15:39 Найти цитируемый пост)
Если брать вопрос про инициализацию структуры нулевыми значениями, то проблема в читабельности кода. Подход с классом выглядит не читабельно и громоздко по сравнению со структурой с 4мя указателями.

Вы имеете ввиду различие в наличие/отсутсвии конструктора ?

ну если проблема в читабельности, то ловите такой вариант :
Код

struct CallbackList { ... };

const CallbackList NullCallbackList = { ... };

void Unregister ()
{
     SetHandler ( NullCallbackList );
}

smile

Это сообщение отредактировал(а) mes - 30.4.2010, 17:32


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 30.4.2010, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Цитата(azesmcar @  30.4.2010,  17:07 Найти цитируемый пост)
я хочу понять задачу целиком, так как мы сейчас говорим о решении локальной проблемы инициализации структур, в то время как возможно это на самом деле и не нужно и задачу можно решить как-то иначе. 

Представь черную коробку, на которой написано "OS", коробка принимает структуру из четырех членов - указателей. Если указатели нулевые, то установленные пользовательские обработчики заменяются на системные. Ну и как я уже несколько раз выше писал хочется такого:

Код

void Unregister ()
{
     SetHandler ( NullCallbackList );
}


Но без такого smile 

По крайней мере теперь понятно, что такое:

Код

void foo(MyStruct ms = (MyStruct){0, 0, 0, 0})
{
}


Можно использовать безопасно, но как сказал mes, он где-то видел, что этого делать не рекомендуется. А вот в случае с классами лучше такого вообще не делать, так как  редко когда будут соблюдены все условия, чтобы инициализация нулем работала.

Цитата(mes @  30.4.2010,  17:24 Найти цитируемый пост)

Код

const CallbackList NullCallbackList = { ... };


Постоянно висящая переменная плюс новая функция - обертка. Переменная NullCallbackList будет так и так каждый раз копироваться на стек. Мой вариант мне уже не кажется таким уж плохим:

Код

class MyClass
{
    MyClass (int arg1 = 0, int arg2 = 0, int arg3 = 0, int arg4 = 0) : m_var1(arg1), m_var2(arg2), m_var3(arg3), m_var4(arg4)
    {}
public:
    int m_var1, m_var2, m_var3, m_var4;
};
...
void SetHandler(MyClass mc = MyClass())
{
}


Наличие конструктора, как я понимаю, превращает MyClass в не POD тип.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.4.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SABROG @  30.4.2010,  17:35 Найти цитируемый пост)
Постоянно висящая переменная плюс новая функция - обертка.

пока не взяли адрес, ее можно считать (при включенной оптимизации) не существующей..  


Цитата(SABROG @  30.4.2010,  17:35 Найти цитируемый пост)
плюс новая функция - обертка

Где функция обертка ? Unregister ? так она лишь для демонстрации, и применена на основании Ваших же примеров.

Цитата(SABROG @  30.4.2010,  17:35 Найти цитируемый пост)
Переменная NullCallbackList будет так и так каждый раз копироваться на стек.

А когда передается параметром по умолчанию в стек разве не копируется ?   smile  smile

Добавлено через 5 минут и 15 секунд
Цитата(SABROG @  30.4.2010,  17:35 Найти цитируемый пост)
Но без такого smile 

"Это " для читабельности.. для Вашей структуры вполне достаточно инициализации обычным способом
Код

SetHandler  ( CallbackList () );

 если SetHandler ваша, то
Код

void SetHandler ( CallbackList cb_list = CallbackList() );

хотя, имхо, с Null... именно для читабельности, а также для самоконтроля, лучше ..


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 30.4.2010, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Preambulus:
Прошу менять простить, если в ближайшие часы, я буду беспредельничать и говорить глупости. Пятница и я немного нетрезв.  smile 

Ambulus:
Цитата(mes @  30.4.2010,  19:22 Найти цитируемый пост)
хотя, имхо, с Null... именно для читабельности, а также для самоконтроля, лучше .. 

Типу NULL я никогда не доверял. Но я не ошибся, ты имеешь ввиду такую конструкцию?

Код

void SetHandler(CallbackList cb_list = 0);

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

Цитата(mes @  30.4.2010,  19:22 Найти цитируемый пост)
пока не взяли адрес, ее можно считать (при включенной оптимизации) не существующей..  

С этим я согласен. Только еще с тех времен, когда я писал на ассемблере, premature optimisation засело в голову.

Цитата(mes @  30.4.2010,  19:22 Найти цитируемый пост)
А когда передается параметром по умолчанию в стек разве не копируется ?

Копируется конечно. В моем случае оно просто копируется, а в твоем оно копируется, да еще и висеть член NullCallbackList остается в памяти, это если без оптимизации, хотя согласен, аргумент не убедительный, но не доверяю я ей. Думается мне, что лишний раз лучше не провоцировать компилятор на оптимизацию.

Цитата(mes @  30.4.2010,  19:22 Найти цитируемый пост)
вполне достаточно инициализации обычным способом

Таким?

Код

MyStruct ms = {0, 0, 0, 0};
foo(ms);


А в своем коде, если бы эта пара строк встречалась хотябы 3 раза, ты бы так и оставил или все-таки сделал класс?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
azesmcar
Дата 30.4.2010, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



SABROG

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

typedef QVector<int> MyClass;

void SetHandler(const MyClass& mc = MyClass())
{
    if (mc.empty())
        return clearFilter();
    ...
}

int main()
{
    SetHandler(MyClass() << 1 << 2);
    SetHandler();
}

PM   Вверх
mes
Дата 30.4.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(azesmcar @  30.4.2010,  19:11 Найти цитируемый пост)
   SetHandler(MyClass() << 1 << 2);

ну если плыть по этому руслу, то "оболочка" SetHandler  лишняя, MyClass может успешно справиться самостоятельно..



--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 30.4.2010, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(mes @  30.4.2010,  20:22 Найти цитируемый пост)
ну если плыть по этому руслу, то "оболочка" SetHandler  лишняя, MyClass может успешно справиться самостоятельно..

не совсем понял что вы имеете ввиду.
PM   Вверх
SABROG
Дата 30.4.2010, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Цитата(azesmcar @  30.4.2010,  20:11 Найти цитируемый пост)
Мне немного не нравиться то, что если завтра обработчиков понадобиться больше - то придется добавлять новые аргументы. Может сделать как-то так?


В моем случае те константы, которые я использую не менялись в течении 15 лет (так как часть кода я тырю из утилиты, которой именно столько и новых констант я не увидел в современной ОС с последними апдейтами). К тому же я использую некоторые "хаки", которые буквально через месяц возможно не будут работать (а у меня выбора нет, публичного API предоставляющего такие возможности у библиотеки нет). Но в целом твоя идея правильная. Просто разницы особой не будет:

Код

MyClass() << 1 << 2 // что сюда добавить новый хендлер


Код

static const StateHandler[] = {&handlerOne, &handlerTwo, ..., &handlerThirty}; // что сюда handlerThirtyOne


P.S.: проплюсовал трёх человек по разным причинам. azesmcar - я тебе написал в комменте "за идеи", а сейчас подумал и решил, что скорее за "конкретику", очень уж мне понравились цитаты из стандарта.

Это сообщение отредактировал(а) SABROG - 30.4.2010, 20:36


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.4.2010, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(azesmcar @  30.4.2010,  19:25 Найти цитируемый пост)

не совсем понял что вы имеете ввиду. 

Код

Handlers::Instahnce() << _1 << _2;
// или в таком исполнении
Handlers::Instahnce() += _1;
Handlers::Instahnce() -= _1;


smile


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 30.4.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



mes

Понятно, ну тогда еще что-то такое
Код

Handlers::Instahnce().clear();


PM   Вверх
mes
Дата 30.4.2010, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SABROG @  30.4.2010,  19:26 Найти цитируемый пост)
    
static const StateHandler[] = {&handlerOne, &handlerTwo, ..., &handlerThirty};

то у Вас 4 указателя, теперь 30.. я так понимаю эти 30 по очереди будут использовать как вышеупомянутые callback`и ?
тогда напрашивается решение сделать разрегистрацию тоже State`ом
smile


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 30.4.2010, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Я смотрю вы там между собой чего-то уже проектировать начали  smile Я стараюсь не использовать синглтоны так как их много где критикуют, у меня просто выбора нет, я наследуюсь от синглтона библиотеки. Метод clear() мне точно не нужен, у меня прочный устойчивый каркас, так как ОС не меняет список состояний динамически, он статичен и зависит только от версии библиотеки.

Цитата(mes @  30.4.2010,  20:43 Найти цитируемый пост)
то у Вас 4 указателя, теперь 30.. я так понимаю эти 30 по очереди будут использовать как вышеупомянутые callback`и ?

Нет, это уже другой вопрос совсем. Те 4 каллбэка остаются как и были, их количество неизменно. А эти 30 каллбэков это уже реакция всего-лишь на один каллбэк, который принимает в себе эвент от ОС, который может принимать выше 30 состояний.

Это сообщение отредактировал(а) SABROG - 30.4.2010, 20:46


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.4.2010, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(azesmcar @  30.4.2010,  19:39 Найти цитируемый пост)
Понятно, ну тогда еще что-то такое

ага.. главное что не будет лишнего "мазолевания" глаз. smile



--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 30.4.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(SABROG @  30.4.2010,  20:44 Найти цитируемый пост)
Я смотрю вы там между собой чего-то уже проектировать начали  

к новой клавиатуре привыкаю, так что не удивляйся если сейчас еще и после проектировки начну код писать.
надо же попрактиковаться, а то две строки 5 минут набираю smile 

Цитата(SABROG @  30.4.2010,  20:44 Найти цитируемый пост)
Я стараюсь не использовать синглтоны так как их много где критикуют, у меня просто выбора нет, я наследуюсь от синглтона библиотеки

если что-то глобально - никакой разницы оформлено это в виде синглтона или нет, по мне так даже лучше в виде синглтона.
PM   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

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

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0710 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.