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

Поиск:

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


Hacker
****


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

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



У меня около 30 обычных функций с одной и той же сигнатурой, но разным поведением. Есть общая функция в которую поступает структура, где одно из полей типа int state. В зависимости от этого state я вызываю одну из 30 функций. Писать switch() с 30 case'ами не хочется. Что остается, массив с хендлерами (callback'ами)

Код


typedef void (*StateHandler)(MyStruct* arg);

static const StateHandler[] = {&handlerOne, &handlerTwo, ..., &handlerThirty};

void handlerOne(MyStruct* arg)
{
}
...
void handlerThirty(MyStruct* arg)
{
}

void MyMainFoo(MyStruct* arg)
{
    StateHandler[arg->state](arg);
}


?

Если будут варианты, то хотелось бы на чистом C++ с/без stl. Boost и tr1 не предлагайте, пожалуйста.
---
Есть такая глупость:

Код

struct MyStruct
{
    MyStruct (int arg1 = 0
                           , int arg2 = 0
                           , int arg3 = 0
                           , int arg4 = 0) : m_var1(arg1)
            , m_var2(arg2)
            , m_var3(arg3)
            , m_var4(arg4)
    {}
    int m_var1, m_var2, m_var3, m_var4;
};


Сделал, чтобы не приходилось в нескольких методах создавать временную переменную, которая передается в другую функцию:

Код

MyStruct var = {0};
foo(var);


При таком объявлении:

Код

struct MyStruct {
int var1, var2, var3, var4;
};

---
В случае с классом вместо структуры мне достаточно вызвать метод так:

Код

class MyClass
    ...
    method(MyStruct ms = MyStruct());
    ...
};

void MyClass::foo()
{
    method(); // default constructed value MyStruct initialized with 0
}


Как вы могли заметить дизайн структуры гораздо проще и читабельней, но в случае с ней приходится писать много лишнего потом. Вопрос в том, возможно ли инициализировать переменные-члены структуры нулями во время передачи её в качестве default-constructed argument для метода класса? Что-то типа этого:

Код

class MyClass
    ...
    method(MyStruct ms = MyStruct() = {0});
    ...
};



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


Пердупержденный
***


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

Репутация: 4
Всего: 39



Если я правильно понял суть сего длинного поста... В структуре можно сделать конструктор и написать в нем:
Код

memset(this,0,sizeof(*this));

Таким образом по умолчанию в в функцию попадет структура, инициализированная нулями.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
SABROG
Дата 30.4.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(djamshud @ 30.4.2010,  12:12)
Если я правильно понял суть сего длинного поста... В структуре можно сделать конструктор и написать в нем:
Код

memset(this,0,sizeof(*this));

Таким образом по умолчанию в в функцию попадет структура, инициализированная нулями.

По этому поводу такой комментарий встретил:

Код

Formally, this triggers undefined behavior according to
the C++ standard - unfortunately.
It is illegal to "overwrite" a non-POD type using memset,
and having a constructor means that Foo is not POD.
There are proposals for C++0x to formally allow this
(by making sub-categories of "POD" types).

In practice, it is likely to behave as expected in this
simple case (memset would obviously be bad if Foo had
a virtual member, or a base class with such a member).

Unfortunately, in the constructor, there is no simple
and portable way to automatically initialize members of
built-in types to a default value. I am not aware of any
formally portable shortcut to avoid the error-prone
listing of every member in the initialization-list:
Foo():a(0),b(0),c(0),d(0),e(0),f(0),g(0),h(0),i(0) ,j(0),k(0){}

However, some compilers or source-checking tools may
provide warnings if only a subset of members is listed
in an initialization-list.



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


Пердупержденный
***


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

Репутация: 4
Всего: 39



Там про классы написано с виртуальными методами и сложными данными внутри, как я понял. Структуре с членами-интами и прочими POD-типами ничего не станет, как я считаю, по крайней мере сам применял такой подход неоднократно, и проблем не было.

ЗЫ. Да и классам с таблицей виртуальных функций, но с простыми POD-членами, тоже ничего не станет, т.к. те компиляторы, что я я видел, отделяют данные от всего прочего и указать на объект фактически является указателем на поле данных объекта.

Добавлено через 6 минут
Ну и в догонку, писать больше, но проблем с "плохой инициализацией" не будет:

Код

struct A{
int a;
int b;};

void foo(struct A const &stA=(struct A){0,0}){
printf("a=%d,b=%d\n",stA.a,stA.b);
}



--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
KOHCEPBATOP
Дата 30.4.2010, 12:40 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(djamshud @  30.4.2010,  12:25 Найти цитируемый пост)
Структуре с членами-интами и прочими POD-типами ничего не станет, как я считаю, по крайней мере сам применял такой подход неоднократно, и проблем не было.
Согласен.

Если очень боязно, можно сделать так:
Код

struct MyStruct {
   struct s {
      int var1, var2, var3, var4;
   } v;
   MyStruct(){ZeroMemory(&v,sizeof(v));};
};

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


uploading...
****


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

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



SABROG

Код

struct test
{
    int a;
    int b;
    int c;
};

int main()
{
    test t = test();
    std::cout << t.a << t.b << t.c << std::endl; // все нули
}

может так?

Это сообщение отредактировал(а) azesmcar - 30.4.2010, 12:56
PM   Вверх
SABROG
Дата 30.4.2010, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(azesmcar @  30.4.2010,  12:54 Найти цитируемый пост)
может так?

Разве стандарт гарантирует, что все значения будут инициализированы нулями?

Цитата(djamshud @  30.4.2010,  12:25 Найти цитируемый пост)
Ну и в догонку

Код

(MyStruct) {0, 0, 0, 0}


А этот вариант интересен. Я правильно логику понимаю, тут происходит Си cast безымянного set'a (?) с целочисленными значениями к MyStruct? Аналогично:

Код

void foo(int &arg = (int) {0}) // foo(int arg = 0)
{
}


Тогда странно, что такие варианты не работают:

Код

void foo(int &arg = int({0})) // wrong
{
}

void foo(int &arg = static_cast<int>({0})) // wrong
{
}


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


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


Пердупержденный
***


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

Репутация: 4
Всего: 39



SABROG, ага. Только не знаю, как правильно называется этот безымянный сет, не силен в теории. Вспомнил о нем, так как иногда применяю, когда нужно передать в функцию некоторую структуру, а отдельной строкой (и переменной!) инициализировать ее не хочется.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
djamshud
Дата 30.4.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

Репутация: 4
Всего: 39



Удалено по причине: копия

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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
KOHCEPBATOP
Дата 30.4.2010, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(azesmcar @  30.4.2010,  12:54 Найти цитируемый пост)
может так?

Однозначно - так нельзя!  smile 
PM MAIL   Вверх
SABROG
Дата 30.4.2010, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Похоже это называется анонимной структурой, и с ней похоже тоже не все так гладко: http://stackoverflow.com/questions/177393/...-structure-in-c


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


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


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

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



Цитата(SABROG @  30.4.2010,  12:35 Найти цитируемый пост)
Разве стандарт гарантирует, что все значения будут инициализированы нулями?

ну это смотря кого инициализировать.. может и не нулем  smile

Цитата(SABROG @  30.4.2010,  12:35 Найти цитируемый пост)
Аналогично:

не аналогично.. только константной ссылке можно присваивать временный рвалуе объект..

Добавлено через 4 минуты и 17 секунд
Цитата(djamshud @  30.4.2010,  11:25 Найти цитируемый пост)
Структуре с членами-интами и прочими POD-типами ничего не станет, как я считаю, по крайней мере сам применял такой подход неоднократно, и проблем не было.

отличная аргументация  smile 

Цитата(djamshud @  30.4.2010,  11:25 Найти цитируемый пост)
т.к. те компиляторы, что я я видел, отделяют данные от всего прочего и указать на объект фактически является указателем на поле данных объекта.

а вот хотелось бы поподробней узнать, что имелось ввиду.. 


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


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


Пердупержденный
***


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

Репутация: 4
Всего: 39



>http://stackoverflow.com

Проблема их была в том, что структура была размером в 4 мегабайта и стэк заканчивался из-за ее копии.

>( struct bigstruct ){ 0 }

Тут надежда, что компилятор поймет, что всю структуру нужно инициализовать нулем, а компилятор, как я понимаю, делать этого не обязан. При явном перечислении членов структуры проблемы нет.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
SABROG
Дата 30.4.2010, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(mes @  30.4.2010,  13:50 Найти цитируемый пост)
только константной ссылке можно присваивать временный рвалуе объект..

Значит gcc 4.4.1 не следует стандарту? Все компилится и работает без константности.

Цитата(mes @  30.4.2010,  13:50 Найти цитируемый пост)
отличная аргументация

smile надеюсь это была ирония.

Цитата(djamshud @  30.4.2010,  14:01 Найти цитируемый пост)
Проблема их была в том, что структура была размером в 4 мегабайта и стэк заканчивался из-за ее копии.

По иронии название их сайта совпадает с проблемой smile

Ясно. Значит правила все-таки есть. Инициализировать каждый член по отдельности. Добавлять ключевое слово "struct", чтобы оставить совместимость с языком Cи.

Осталось понять насчет константности ссылки и почему static_cast'ом нельзя привести безымянную структуру к нужному типу.

По второму вопросу, с хэндлерами, есть мысли?


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


uploading...
****


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

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



Цитата(KOHCEPBATOP @  30.4.2010,  13:47 Найти цитируемый пост)
Однозначно - так нельзя!  smile  

да ну?
Цитата(mes @  30.4.2010,  13:50 Найти цитируемый пост)
отличная аргументация  smile 


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


Пердупержденный
***


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

Репутация: 4
Всего: 39



>отличная аргументация

Не аргументация, а поправка.

>а вот хотелось бы поподробней узнать, что имелось ввиду.. 

С виртуальными функциями я погорячился. А имелось в виду:

Код

class Class{
public:
//virtual void foo(){}
void bar(){}
int data;
Class(){this->data=5;}
};

int data;
memcpy(&data,new Class,sizeof(int));
printf("%d\n",data);//print 5


Но это уже хаки, на них рассчитывать не нужно, конечно.

>По второму вопросу, с хэндлерами, есть мысли?

Вами же предложенный массив, чем не решение?


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 30.4.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(SABROG @  30.4.2010,  13:35 Найти цитируемый пост)
Разве стандарт гарантирует, что все значения будут инициализированы нулями?


Цитата

8.5 Initializers

To default initialize an object of type T means:
— if T is a nonPOD class type (clause 9), the default constructor for T is called (and the initialization is ill formed if T has no accessible default constructor);
— if T is an array type, each element is default initialized;
— otherwise, the storage for the object is zero initialized.



Это сообщение отредактировал(а) azesmcar - 30.4.2010, 14:36
PM   Вверх
SABROG
Дата 30.4.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(azesmcar @  30.4.2010,  14:31 Найти цитируемый пост)
— otherwise, the storage for the object is zero initialized.


Ага, значит, если типы в структуре Plain Old Data (POD - int, char и т.д.), то они должны автоматически инициализироваться нулями. Значит в моем случае следующий код сделает всё сам:

Код

void testFn(MyStruct ms = MyStruct())
{
}


Цитата(djamshud @  30.4.2010,  14:29 Найти цитируемый пост)
Вами же предложенный массив, чем не решение?


Да какое-то он в стиле Си. Я конечно ничего против языка Си не имею, но думал, может функторы какие-нибудь применить можно, классы, stl.

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


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


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


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

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



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

Код


int f();

int r& = f(); 

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

int f();
int crf ( int const& );

crf ( f() );


Добавлено через 42 секунды
Цитата(SABROG @  30.4.2010,  13:49 Найти цитируемый пост)
Значит в моем случае следующий код сделает всё сам:

 smile 


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


Hacker
****


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

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



Цитата(mes @  30.4.2010,  14:52 Найти цитируемый пост)
почему здесь нельзя инизиализировать ссылку значением понятно  ?

Об этом я знал, просто меня удивил твой комментарий насчет "не эквивалентности". Я ведь о другой эквивалентности говорил, о приведении (объявлении?) безымянной структуры к нужному типу или нужного типа, а не о правах доступа/свойстве объекта. Я так до сих пор в этом не разобрался, что там происходит "(int){0}" толи объявление, толи приведение.

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


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


uploading...
****


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

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



SABROG

Да, впрочем к агрегатам (?) можно и такой способ применить
Код

MyStruct t = {0};

Цитата(aggregate)

An aggregate is an array or a class (clause 9) with no userdeclared constructors (12.1), no private or protected nonstatic data members (clause 11), no base classes (clause 10), and no virtual functions (10.3).

можешь тут почитать, тоже доп. информация.
http://forum.vingrad.ru/forum/topic-257566...y1856934/0.html
PM   Вверх
SABROG
Дата 30.4.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(azesmcar @  30.4.2010,  15:17 Найти цитируемый пост)
Да, впрочем к агрегатам (?) можно и такой способ применить

У меня ситуация несколько иная, есть несколько функций, где идет вызов другой функции, в которую нужно передать структуру инициализированную нулями. Поэтому я хотел от такого избавиться:

Код

void foo1()
{
    MyStruct t = {0};
    myfunc(MyStruct);
}

void foo2()
{
    MyStruct t = {0};
    myfunc(MyStruct);
}

void foo3()
{
    MyStruct t = {0};
    myfunc(MyStruct);
}

void foo4()
{
    MyStruct t = {0};
    myfunc(MyStruct);
}



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


uploading...
****


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

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



Код

void foo1()
{
    myfunc(MyStruct());
}
void foo2()
{
    myfunc(MyStruct());
}
void foo3()
{
    myfunc(MyStruct());
}
void foo4()
{
    myfunc(MyStruct());
}

ну или с default значением, но это только для POD структур.

а зачем нужны несколько функций, которые делают тоже самое? smile 

Это сообщение отредактировал(а) azesmcar - 30.4.2010, 15:27
PM   Вверх
mes
Дата 30.4.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(SABROG @  30.4.2010,  14:01 Найти цитируемый пост)
Я ведь о другой эквивалентности говорил, 


ну так мой комментарий относился к слову "аналогично", которое в свою очередь относилось к строке 
Код

void foo(int &arg = (int) {0})...

т.е.  я подчеркнул , что она не аналогична
Код

void foo(const int &arg = (int) {0})...



Цитата(SABROG @  30.4.2010,  14:01 Найти цитируемый пост)
Я ведь о другой эквивалентности говорил, о приведении (объявлении?) безымянной структуры к нужному типу или нужного типа,

{0,0} - не есть безымянная структура, и создать объект без указания типа по такому определению не получится.

Цитата(SABROG @  30.4.2010,  14:01 Найти цитируемый пост)
а не о правах доступа/свойстве объекта. 

о правах доступа в этой теме вообще никто не говорил smile

Цитата(SABROG @  30.4.2010,  14:01 Найти цитируемый пост)
Я так до сих пор в этом не разобрался, что там происходит "(int){0}" толи объявление, толи приведение.

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



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


Hacker
****


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

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



Цитата(azesmcar @  30.4.2010,  15:25 Найти цитируемый пост)
ну или с default значением, но это только для POD структур.

Код

class MyClass {
private:
    int member;
};

MyClass ведь не POD тип? Но член member все-равно будет проиницилизирован нулем, так как он POD?

Цитата(azesmcar @  30.4.2010,  15:25 Найти цитируемый пост)
а зачем нужны несколько функций, которые делают тоже самое?

Функция принимает в качестве параметров структуру с указателями на callback функции для установки перехватчика. Иногда есть необходимость снимать ранее установленые перехватчики, чтобы вызывался оригинальный хендлер, для того, чтобы избежать рекурсии. Можно конечно написать новую функцию типа uninstallFilter(). Но я решил вместо этого вызывать функцию типа setFilter() без параметров, чтобы снять ранее установленные обработчики.

Пока подержу тему открытой, нужны мысли по поводу массива хэндлеров. Неужели это единственно верный и самый компактный вариант?


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


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


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

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



Цитата(SABROG @  30.4.2010,  14:23 Найти цитируемый пост)
У меня ситуация несколько иная, 

ну так Вы столько воды в этой теме налили, что в ее расплывах и не видно где у Вас проблема то..
smile

Добавлено через 2 минуты и 52 секунды
Цитата(SABROG @  30.4.2010,  14:47 Найти цитируемый пост)

Функция принимает в качестве параметров структуру с указателями на callback функции для установки перехватчика.

а чем виртуальные функции не угодили то ?

Добавлено через 4 минуты и 7 секунд
Цитата(SABROG @  30.4.2010,  14:47 Найти цитируемый пост)
Иногда есть необходимость снимать ранее установленые перехватчики, чтобы вызывался оригинальный хендлер, для того, чтобы избежать рекурсии.

тут не понятно о чем Вы.. отдалено предполагаю, что хандлер при вызове сам устанавливает хандлеры..


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


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


uploading...
****


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

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



Цитата(SABROG @  30.4.2010,  15:47 Найти цитируемый пост)
Но член member все-равно будет проиницилизирован нулем, так как он POD?

нет, не будет.
Цитата

A POD-struct is an aggregate class that has no nonstatic data members of type pointer to member, non-PODstruct, nonPOD-union (or array of such types) or reference, and has no user-defined copy assignment operator and no user-defined destructor.

Цитата

An aggregate is an array or a class (clause 9) with no user-declared constructors (12.1), no private or protected nonstatic data members (clause 11), no base classes (clause 10), and no virtual functions (10.3).

можно проверить
Код

struct MyStruct
{
    friend int main();
private:
    int a;
    int b;
    int c;
};

int main()
{
    MyStruct t = MyStruct();
    std::cout << t.a << t.b << t.c << std::endl; // нулей уже нет
}


Добавлено через 3 минуты и 23 секунды
Цитата(SABROG @  30.4.2010,  15:47 Найти цитируемый пост)
Неужели это единственно верный и самый компактный вариант?

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


Hacker
****


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

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



Цитата(mes @  30.4.2010,  15:49 Найти цитируемый пост)
и не видно где у Вас проблема то

Если брать вопрос про инициализацию структуры нулевыми значениями, то проблема в читабельности кода. Подход с классом выглядит не читабельно и громоздко по сравнению со структурой с 4мя указателями.

Цитата(mes @  30.4.2010,  15:49 Найти цитируемый пост)
а чем виртуальные функции не угодили то ?

Функция библиотеки (не моей) принимает в качестве аргумента структуру в которой нужно передать 4 указателя на обычные статические функции. Я не могу этого изменить, но могу обернуть этот вызов в свои функции.

Цитата(mes @  30.4.2010,  15:46 Найти цитируемый пост)
{0,0} - не есть безымянная структура, и создать объект без указания типа по такому определению не получится.

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

Чего-то я запутался smile В чем разница между первой и второй цитатой?

Цитата(mes @  30.4.2010,  15:46 Найти цитируемый пост)
о правах доступа в этой теме вообще никто не говорил

Короче речь о const-correctness, уж не знаю как это правильно перевести.

Цитата(mes @  30.4.2010,  15:46 Найти цитируемый пост)
но, на сколько я знаю, такой подход нежелателен по стандарту

Ага, то есть еще одна дверь закрывается и остается полагаться на default constructed value для POD типов или как более универсальный, но слишком громоздкий и нечитабельный вариант с классом как в первом моем посте.

Цитата(mes @  30.4.2010,  15:49 Найти цитируемый пост)
тут не понятно о чем Вы.

Не заморачивайся, у меня самого сейчас та еще каша в голове. Просто даже по логике необходимость подготавливать аргумент, значение которого заранее известно, в функцию или метод кажется не совсем правильной. Зачем писать лишний код где-то отдельно, если можно поставить значение по умолчанию или инициализировать структуру сразу при вызове функции?

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

ОС присылает int'овые состояния, которых больше 30, на кажое состояние отдельные функции, которые запрашивают от ОС дополнительную информацию о них у той же ОС. Вот я и не хочу делать 30 и более case'ов.

Цитата(azesmcar @  30.4.2010,  16:05 Найти цитируемый пост)
нет, не будет.

А это уже проблема. Значит между этими двумя вариантами большая разница:

Код

void testFn(MyStruct ms = MyStruct()) // стандарт гарантируется инициализацию POD типов-членов структуры нулями
{
}

void testFn(MyClass ms = MyClass()) // стандарт не гарантирует инициализацию членов нулями
{
}


Я правильно понял?

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


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


uploading...
****


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

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



Цитата(SABROG @  30.4.2010,  16:39 Найти цитируемый пост)
А это уже проблема. Значит между этими двумя вариантами большая разница:

нет, на самом деле между классом и структурой только одна разница, по умолчанию все члены класса являются private и наследование по умолчанию от класс - private. Все остальное тоже самое. В примере выше проблема не в использовании ключевого слова class, а в приватности члена класса.

Цитата(SABROG @  30.4.2010,  16:39 Найти цитируемый пост)
ОС присылает int'овые состояния, которых больше 30, на кажое состояние отдельные функции, которые запрашивают от ОС дополнительную информацию о них у той же ОС. Вот я и не хочу делать 30 и более case'ов.

map или массив+указатель на функцию. А причем тут инициализация структур?

Это сообщение отредактировал(а) azesmcar - 30.4.2010, 16:48
PM   Вверх
SABROG
Дата 30.4.2010, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(azesmcar @  30.4.2010,  16:46 Найти цитируемый пост)
В примере выше проблема не в использовании ключевого слова class, а в приватности члена класса.

Значит тут такая ситуация?
Код

class MyClass {
public:
    int var1;
};

void foo(MyClass mc = MyClass()) // всё ок
---
class MyClass {
    int var1;
};

void foo(MyClass mc = MyClass()) // проблема?
---
class MyClass {
    int var1'
public:
    int var2;
};

void foo(MyClass mc = MyClass()) // var2 инициализирована нулем, var1 - undefined


Так чтоль?

Цитата(azesmcar @  30.4.2010,  16:46 Найти цитируемый пост)
А причем тут инициализация структур?

Я уже путаюсь о чем вы меня спрашиваете.


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


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


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

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



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

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

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

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

Цитата(SABROG @  30.4.2010,  19:44 Найти цитируемый пост)
он статичен и зависит только от версии библиотеки. 

ну так видите сколько нужного Вы держали в секрете 
smile

Добавлено через 3 минуты и 8 секунд
Цитата(SABROG @  30.4.2010,  19:44 Найти цитируемый пост)
Те 4 каллбэка остаются как и были, их количество неизменно. А эти 30 каллбэков это уже реакция всего-лишь на один каллбэк, который принимает в себе эвент от ОС, который может принимать выше 30 состояний.


тогда не пойму что мы всю тему обсуждали, если у Вас каллбяки один раз подключились и один раз отключились ?!

Добавлено через 4 минуты и 41 секунду
Вы уж простите меня как топик_стартер, но я выступаю за то, чтоб считать тему не законченной и ожидаю подробностей задачи. 
smile


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


uploading...
****


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

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



Цитата(mes @  30.4.2010,  20:51 Найти цитируемый пост)
Вы уж простите меня как топик_стартер, но я выступаю за то, чтоб считать тему не законченной и ожидаю подробностей задачи. 

Я тоже требую продолжения банкета smile 
PM   Вверх
SABROG
Дата 30.4.2010, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(mes @  30.4.2010,  20:51 Найти цитируемый пост)
и ожидаю подробностей задачи

Как вы могли догадываться всё дело пишется на Qt. Наследование не отъемлемая часть, я наследуюсь от QApplication. 4 callback'а это функции типа: beforeSignal, afterSignal, beforeSlot, afterSlot. Это дело не документировано, но работает. То есть тут я устанавливаю фильтра вообще на все сигналы и слоты (такой стандартной возможности в Qt нет, максимум QSignalSpy, которому обязательно нужен конкретный объект и конкретный сигнал. Этим дело не ограничивается и я позарился фильтровать все события приходящие от ОС (WM_* - windows, XEvent - X11). C Windows проблем небыло, есть специальная функция, которая все разбирает и возвращает отладочную информацию в виде строки. С XEvent уже проблемка, в Qt нет нигде формирования отладочной информацией и мне пришлось брать исходники старой утилиты xev, которая написана на Cи и всё переписывать на C++/Qt.

Конечная цель заключается в написании класса на базе QApplication, которая выводит 3 уровня событий: OS (WM_*, X11, Мака нет, так что не судьба), QEvent'ы, Signals and Slots. Способы все это сделать найдены после штудирования исходников Qt, осталось переписать xev с Си на C++. Если всё получится, то выложу на каком-нибудь форуме по Qt в качестве класса для отладки событий приложения, ну и в академическо-образовательных целях.


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


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


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

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



1. Вы устанавливает свой фильтр вместо фильтра приложения. 
2. Там Вы отлавливаете XEvent и в зависимости от него вызываете, я так понимаю,  один из системных методов приложения.
теперь где возникла проблема ? 
в пункте один никакого многоразового использования структуры нет,
а к пункту два это структура никоим образом не относится...

Добавлено через 7 минут и 5 секунд
Цитата(SABROG @  30.4.2010,  20:07 Найти цитируемый пост)
. Наследование не отъемлемая часть, я наследуюсь от QApplication.

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



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


Hacker
****


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

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



Цитата(mes @  30.4.2010,  21:32 Найти цитируемый пост)
Там Вы отлавливаете XEvent и в зависимости от него вызываете, я так понимаю,  один из системных методов приложения.
теперь где возникла проблема ? 

Проблем с реализацией нет. Я изначально вопрос поставил в контексте "правильного стиля программирования".

Цитата(mes @  30.4.2010,  21:32 Найти цитируемый пост)
в пункте один никакого многоразового использования структуры нет,

Это не совсем так. Дело в том, что qDebug() внутри себя содержит объект QTextStream на базе QObject'a и только в деструкторе выводится сообщение в консоль. Разрушаемый QObject шлет сигнал destroyed() после каждого вызова qDebug(), появляется рекурсия, которая неизбежно приводит к крашу. Мне просто необходимо снимать свой фильтр событий перед выводом в консоль, а затем ставить его снова. Но это уже давно не проблема. Я создал глобальную копию QTextStream и отказался от всех вкусносней перегрузки оператора << в qDebug(), а в деструкторе QApplication вызываю снятие фильтра, чтобы программа не крашилась при выходе.


Цитата(mes @  30.4.2010,  21:32 Найти цитируемый пост)
Сама же обработка событий желательно должна быть описана в другом классе.

Дело в том, что система фильтрации требует в качестве фильтруемой функции - статическую функцию. Что мне остается? Создавать синглтон или по копии некоторого класса в каждой из, эмм 5 функций (4 на каллбэки сигналов, 1 на фильтр QEvent'ов). Но даже если описать обработчики событий в качестве методов. Их будет больше 30 или один огромный switch() case.


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


uploading...
****


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

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



Цитата(SABROG @  30.4.2010,  22:00 Найти цитируемый пост)
Дело в том, что система фильтрации требует в качестве фильтруемой функции - статическую функцию. 

Рискуя нарваться на фразу из первого поста "буст не предлагать" все же предложу boost::bind smile 
в крайнем случае можно написать что-то свое, специфическое.

Это сообщение отредактировал(а) azesmcar - 30.4.2010, 22:07
PM   Вверх
mes
Дата 30.4.2010, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(SABROG @  30.4.2010,  21:00 Найти цитируемый пост)
Мне просто необходимо снимать свой фильтр событий перед выводом в консоль, а затем ставить его снова. 

две функции Register и Unregister или одна с флагом и опять же никакого множественного использования структуры..

Добавлено через 54 секунды
Цитата(SABROG @  30.4.2010,  21:00 Найти цитируемый пост)
а в деструкторе QApplication

нда.. помойму Вы не через окно, а через форточку пытаетесь пролезть..



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


Hacker
****


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

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



Цитата(azesmcar @  30.4.2010,  22:06 Найти цитируемый пост)
boost::bind

По идее тут можно обойтись и стандартным std::bind1st(std::mem_fun(&MyClass::myMethod), pointerToMyClassExemplar). Но что в итоге мне это даст, класс с теми же 30 методами-хендлерами?

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

Даже для Unregister требуется передать всю ту же структуру с нулевыми значениями в указателях. Какая разница будет это обертка типа:

Код

void unregister()
{
    MyStruct mc = {0};
    setFilter(mc);
}


или 

Код

void setFilter(MyStruct ms = (MyStruct){0, 0, 0, 0}) // ну или (MyClass mc = MyClass())
{
    setFilter(ms);
}


Цитата(mes @  30.4.2010,  22:12 Найти цитируемый пост)
нда.. помойму Вы не через окно, а через форточку пытаетесь пролезть..

Мне необходимо контролировать жизнь глобального объекта (потому, что я использую функции вместо методов) и жизнь глобального объекта заканчивается после деструктора экземпляра класса QApplication.

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


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


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


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

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



Цитата(SABROG @  30.4.2010,  21:00 Найти цитируемый пост)
Создавать синглтон или по копии некоторого класса в каждой из, эмм 5 функций (4 на каллбэки сигналов, 1 на фильтр QEvent'ов).

 smile 

Цитата(SABROG @  30.4.2010,  21:00 Найти цитируемый пост)
. Но даже если описать обработчики событий в качестве методов. Их будет больше 30 или один огромный switch() case. 

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

повторюсь, помойму Вы перенамутили..

Добавлено @ 22:20
Цитата(azesmcar @  30.4.2010,  21:06 Найти цитируемый пост)
Рискуя нарваться на фразу из первого поста "буст не предлагать" 

"заступлюсь" за тс в этом случае, так как никакой динамики требущей бинда тут нет..

Добавлено @ 22:21
Цитата(SABROG @  30.4.2010,  21:15 Найти цитируемый пост)
Но что в итоге мне это даст, класс с теми же 30 методами-хендлерами? 

Ну так может прежде Вы нам ответите  на вопрос, как ваши 30 хандлеров связаны с регистрацией фильтра ? 


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


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


Hacker
****


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

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



Цитата(mes @  30.4.2010,  22:16 Найти цитируемый пост)
повторюсь, помойму Вы перенамутили.. 

Тогда давайте вернемся к черной коробке с именем (OS). Есть одна функция (свой фильтр), которая принимает эвент от ОС. Количество возможных состояний в эвенте больше 30 и нужно каждое из них обработать. Как поступить? Здоровенный switch() case с >30 вариантами, который по размеру будет как весь код утилиты xev или 30 обработчиков?


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


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


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

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



Цитата(SABROG @  30.4.2010,  21:23 Найти цитируемый пост)
Тогда давайте вернемся к черной коробке с именем (OS). Есть одна функция (свой фильтр), которая принимает эвент от ОС. Количество возможных состояний в эвенте больше 30 и нужно каждое из них обработать. Как поступить? Здоровенный switch() case с >30 вариантами, который по размеру будет как весь код утилиты xev или 30 обработчиков? 

давайте.. Пока не понятно по какому принципу связан евент и 30 вариантов. По имени, числовой константе, зависит от состояния звезд statemachine или иначе ?
если связь прямая,  то через отражение на словарь, для порядковых констант - линейный вектор, а для не порядковых и имен map и т.д

ну и все таки какя взаимосвязь 
Цитата(mes @  30.4.2010,  21:16 Найти цитируемый пост)
с регистрацией фильтра

хоть через switch , хоть без него ?!


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


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


Hacker
****


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

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



Цитата(mes @  30.4.2010,  22:26 Найти цитируемый пост)
Пока не понятно по какому принципу связан евент и 30 вариантов

То ли я уже нажрался в хлам, то ли просто не могу тебя понять. Эвент - структура, в структуре есть int поле, которое может принимать 30 и более значений состояния, все имена состояний описаны в системном хедере линукса. Я их всех undef'нул и создал свой enum с такими же именами, а благодаря метаобъектной системе у этого enum'a еще и появился массив текстовых названий каждого члена перечисления. В общем от числа (int) зависит то какой обработчик я запущу и то, что я буду спрашивать у ОС о дополнительной информации именно этого числового значения.

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

Массив имен есть (static const char* []), значения констант есть (int), имена есть (MyEnum::myName1). Чего не хватает, того массива с адресами обработчиков в первом посте? Тоже есть. Но правильно ли это?

Цитата(mes @  30.4.2010,  22:26 Найти цитируемый пост)
хоть через switch , хоть без него ?!

Структура, где были 4 указателя это для сигналов и слотов. Тут всё очень просто, никаких состояний нет. Тут как бы вопрос закрыт, я понял, что шел правильным путем, только сам язык C++ немного расстроил, пришлось написать больше, чем хотелось бы.

Затем идет второй вопрос с хэндлерами. Это уже тема отдельная, тут ставится всего-лишь один фильтр через передачу адреса на статический метод. Проблема в организации системы обработки этих событий внутри обычной статической функции. Либо писать портянку, либо обрабатывать каждое состояние еще в >30 отдельных функциях. Но ИМХО быстрей получить указатель на функцию через индекс, чем делать >30 сравнений с нужным состоянием.

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


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


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


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

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



Цитата(SABROG @  30.4.2010,  21:15 Найти цитируемый пост)
Мне необходимо контролировать жизнь глобального объекта

обьект может сам этим заниматься..


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

разницы нет функции или функции-члены


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

не требуется.. Register и Unregister статические функции члены класса, также как и саллбяки фильтрации.


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


Hacker
****


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

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



Цитата(mes @  30.4.2010,  22:46 Найти цитируемый пост)
обьект может сам этим заниматься..

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

Цитата(mes @  30.4.2010,  22:46 Найти цитируемый пост)
разницы нет функции или функции-члены

Ну разница обычно в том, что статические функции-члены не имеют доступа к членам класса в отличае от методов. Конечно можно приводить qApp к моему классу, чтобы получить указатель на объект класса.

Цитата(mes @  30.4.2010,  22:46 Найти цитируемый пост)
не требуется.. Register и Unregister статические функции члены класса, также как и саллбяки фильтрации.

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

Код

void unregister()
{
    MyStruct mc = {0};
    setFilter(mc);
}


Но это же еще одна функция. Не лучше ли просто передать аргумент по умолчанию инициализированный нулевыми значениями? Хотя с unregister() повышается читабельность кода, тут надо подумать, что мне важнее, понимать код через пару лет или искать комментария по коду и в голове прокручивать логику.


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


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


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

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



Цитата(SABROG @  30.4.2010,  21:35 Найти цитируемый пост)
. Эвент - структура, в структуре есть int поле, которое может принимать 30 и более значений состояния, 

Ну мне откуда должно быть это известно, что там у Вас, если Вы этого не говорили ? тем более что мы не в ветке линукса сидим smile 
Терь знаем.. значит удобно отразить на вектор. оистался вопрос вектор чего.. smile


Цитата(SABROG @  30.4.2010,  21:35 Найти цитируемый пост)
их всех undef'нул и создал свой enum с такими же именами, а благодаря метаобъектной системе у этого enum'a еще и появился массив текстовых названий каждого члена перечисления.

Вот это опять вода.. суть порядковые они или нет ?



Цитата(SABROG @  30.4.2010,  21:35 Найти цитируемый пост)
В общем от числа (int) зависит то какой обработчик я запущу и то, что я буду спрашивать у ОС о дополнительной информации именно этого числового значения.

и это вполне можно было опустить )
Цитата(SABROG @  30.4.2010,  21:35 Найти цитируемый пост)
Тоже есть. Но правильно ли это?

исходя из того как я понял представленное, не очень.

Добавлено через 6 минут и 41 секунду
Цитата(SABROG @  30.4.2010,  22:03 Найти цитируемый пост)

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

мм.. кто он ?


Цитата(SABROG @  30.4.2010,  22:03 Найти цитируемый пост)
Ну разница обычно в том, что статические функции-члены не имеют доступа к членам класса в отличае от методов. Конечно можно приводить qApp к моему классу, чтобы получить указатель на объект класса.

зачем ? статические функции фильтра адресуют вызов методу обработчика, который представлен например статической переменной..

Добавлено через 12 минут и 59 секунд
Цитата(SABROG @  30.4.2010,  22:03 Найти цитируемый пост)
Но это же еще одна функция. 

да, только не функция, а статическая функция-член


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

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



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


Hacker
****


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

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



Цитата(mes @  30.4.2010,  23:05 Найти цитируемый пост)
Вот это опять вода.. суть порядковые они или нет ?

Если бы я знал значение слова "порядковый", то сказал бы. Могу сказать, что числа идут неразрывно от нуля до >30, то есть если делать i++, то будет последовательный перебор всех состояний.

Цитата(mes @  30.4.2010,  23:05 Найти цитируемый пост)
Терь знаем.. значит удобно отразить на вектор. оистался вопрос вектор чего

smile вероятно вектор хендлеров, так как первый элемент вектора будет характеризовать состояние со значением 0 и т.д. Только вот вектор ведь заполняется в рантайме, а Си массив уже заполненый загружается.

Цитата(mes @  30.4.2010,  23:05 Найти цитируемый пост)
исходя из того как я понял представленное, не очень. 

Нуу, эмм, советуйте как правильней...


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


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


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

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



Цитата(SABROG @  30.4.2010,  22:03 Найти цитируемый пост)
Хотя с unregister() повышается читабельность кода, тут надо подумать, что мне важнее, понимать код через пару лет или искать комментария по коду и в голове прокручивать логику

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

Добавлено через 1 минуту и 25 секунд
Цитата(SABROG @  30.4.2010,  22:18 Найти цитируемый пост)
что числа идут неразрывно от нуля до >30, то есть если делать i++, то будет последовательный перебор всех состояний.

сорри, я перепутал "порядковыйй" с "последовательным".

Добавлено через 2 минуты и 10 секунд
Цитата(SABROG @  30.4.2010,  22:18 Найти цитируемый пост)
вероятно вектор хендлеров,

хэндлер может быть выражен как методом, так и объектом.

Добавлено через 5 минут и 29 секунд
Цитата(SABROG @  30.4.2010,  22:18 Найти цитируемый пост)
Только вот вектор 

вектор, в контексте темы, это не std::vector, a любое линейно представленный контейнер, в том числе и обычный массив.

Добавлено через 7 минут и 1 секунду
Цитата(SABROG @  30.4.2010,  22:18 Найти цитируемый пост)
Нуу, эмм, советуйте как правильней... 

ну так пытаюсь, но Вы так и не ответили как связан хэндлер и регистрация фильтра.. 



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


Hacker
****


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

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



Цитата(mes @  30.4.2010,  23:05 Найти цитируемый пост)
мм.. кто он ?

Объект.

Цитата(mes @  30.4.2010,  23:05 Найти цитируемый пост)
зачем ? статические функции фильтра адресуют вызов методу обработчика, который представлен например статической переменной..

То есть мне нужно 30 статических переменных, которые будут предоставлять метод для обработки состояний?

Цитата(mes @  30.4.2010,  23:05 Найти цитируемый пост)
да, только не функция, а статическая функция-член

А какому классу она должна принадлежать, QApplication?

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

Цитата(mes @  30.4.2010,  23:21 Найти цитируемый пост)
приведенные пункты не противоречат друг друга.. Т.е. чем луше читабельность, тем меньше напрягов с комментами и логикой.

Согласен. Сделаю Register и Unregister.

Цитата(mes @  30.4.2010,  23:21 Найти цитируемый пост)
хэндлер может быть выражен как методом, так и объектом.

Если объектом считать указатель на функцию, то смысла добавлять её в вектор не вижу. Если объектом считать некий класс, который будет предоставлять перегруженный оператор (), то объявлять >30 классов не хотелось бы.


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


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


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

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



Цитата(SABROG @  30.4.2010,  22:28 Найти цитируемый пост)
Если объектом считать некий класс, который будет предоставлять перегруженный оператор (),

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


Цитата(SABROG @  30.4.2010,  22:28 Найти цитируемый пост)
, то смысла добавлять её в вектор не вижу

под вектором подразумевается так же и тот же самый си-массив. 

Цитата(SABROG @  30.4.2010,  22:28 Найти цитируемый пост)
то объявлять >30 классов не хотелось бы. 

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

Добавлено @ 23:43
Цитата(SABROG @  30.4.2010,  22:28 Найти цитируемый пост)
То есть мне нужно 30 статических переменных

нет.. не стоит впадать в крайности..  достаточно и одной. smile

Добавлено через 3 минуты и 58 секунд
Цитата(SABROG @  30.4.2010,  22:28 Найти цитируемый пост)
А какому классу она должна принадлежать, QApplication?

тут зависит от Вас.. правильнее выразить через отдельный класс, но если лень и MyApplicatioн чист, то можно и в нем напрямую.

Добавлено через 5 минут и 58 секунд
могу набросать схему кода, если ответите на мой неоднакратно поставленный вопрос, как хэндлер связан с регистацией фильтра  ?
а также что должно быть на выходе хэндлера ? в чем выражается его работа ? 


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


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


uploading...
****


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

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



Цитата(SABROG @  30.4.2010,  22:35 Найти цитируемый пост)
То ли я уже нажрался в хлам, то ли просто не могу тебя понять. Эвент - структура, в структуре есть int поле, которое может принимать 30 и более значений состояния, все имена состояний описаны в системном хедере линукса. Я их всех undef'нул и создал свой enum с такими же именами, а благодаря метаобъектной системе у этого enum'a еще и появился массив текстовых названий каждого члена перечисления. В общем от числа (int) зависит то какой обработчик я запущу и то, что я буду спрашивать у ОС о дополнительной информации именно этого числового значения.


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

не совсем понял причем тут динамика? Ну это может быть не байнд а 
Цитата(SABROG @  30.4.2010,  22:15 Найти цитируемый пост)
По идее тут можно обойтись и стандартным std::bind1st(std::mem_fun(&MyClass::myMethod)

в принципе да, вполне можно обойтись без boost::bind, вот набросал пример.
Я не успеваю за вами все читать, так что извините если мой пост устареет к тому времени smile 
Код

#include <map>
#include <functional>
#include <iostream>

class Methods
{
    typedef std::mem_fun1_t<void, Methods, int> filterFunction;
    typedef std::map<int, filterFunction> filterMap;
public:
    Methods() {
        filters.insert(filterMap::value_type(0, filterFunction(&Methods::filter1)));
        filters.insert(filterMap::value_type(1, filterFunction(&Methods::filter2)));
        filters.insert(filterMap::value_type(2, filterFunction(&Methods::filter3)));
    }
    void invoke(int signal) {
        filterMap::iterator it = filters.find(signal);
        if (it == filters.end())
            throw std::runtime_error("Filter not registered");
        it->second(this, signal);
    }
    void filter1(int signal) {
        std::cout << signal << std::endl;
    }
    void filter2(int signal) {
        std::cout << signal << std::endl;
    }
    void filter3(int signal) {
        std::cout << signal << std::endl;
    }
private:
    filterMap filters;
};

int main()
{
    Methods m;
    m.invoke(1);
    m.invoke(2);
}


Это сообщение отредактировал(а) azesmcar - 1.5.2010, 08:26
PM   Вверх
mes
Дата 1.5.2010, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  1.5.2010,  07:24 Найти цитируемый пост)
не совсем понял причем тут динамика? Ну это может быть не байнд а 

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

Цитата(azesmcar @  1.5.2010,  07:24 Найти цитируемый пост)
в принципе да, вполне можно обойтись без boost::bind, вот набросал пример.

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

Цитата(azesmcar @  1.5.2010,  07:24 Найти цитируемый пост)
не успеваю за вами все читать, так что извините если мой пост устареет к тому времени 

ну вот я как раз и рассказал, основное, что смоглось выясниться у тс.

smile


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


uploading...
****


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

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



Цитата(mes @  1.5.2010,  08:52 Найти цитируемый пост)
также мы выяснили, что ид эвентов последовательны, и вместо мап вполне подходит линейный контейнер (и тс отдает предпочтение статическому константному масиву).

 smile не дочитал до этого, но саму идею это не отменяет.
PM   Вверх
mes
Дата 1.5.2010, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  1.5.2010,  07:56 Найти цитируемый пост)
но саму идею это не отменяет. 

 smile 


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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