powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему нельзя передавать параметром метод класса?
19 сообщений из 94, страница 4 из 4
Почему нельзя передавать параметром метод класса?
    #33938063
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedГде я тип привел? Обижаете. Ни одного оператора приведения НЕТ!!!ну было такое:
Код: plaintext
1.
2.
// Пришлость явно инстанциировать, иначе cerr юудет передаваться
// как ostream, а y ios_base конструктор копирования в private
tm.start<Func2, ostream&>(Func2(a, &A::dump), cerr, timeout);
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33938462
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedВот вам новый опус(на скрепке)что-то мусор какой-то распаковывается...
От меня вот тоже опус :)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33938493
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то есть вот так
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33939503
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo blindedГде я тип привел? Обижаете. Ни одного оператора приведения НЕТ!!!ну было такое:
Код: plaintext
1.
2.
// Пришлость явно инстанциировать, иначе cerr юудет передаваться
// как ostream, а y ios_base конструктор копирования в private
tm.start<Func2, ostream&>(Func2(a, &A::dump), cerr, timeout);

Не, батенька, это не приведение типа, это явная инстанциация!!! две большие разницы. Это я я явно сказал компилятору какой метод я хочу вызвать, потому что он гад такой при неявной подстановке (сам умничал) вызывал
tm.start<Func2, ostream>.
Ну за опус извините, видно загрузился криво, повторяю. Там одно файло поэтому просто gz без tar
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33939743
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoто есть вот так

Это, как мне кажется есть, то, что и надо было. Вообщем, буду юзать в этом виде:
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33940662
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedТам одно файло поэтому просто gz без tarпонятно... Зачем в тар-то запаковано? Да ещё без расширения? В гз ведь можно без тара паковать. Эхх... линуксоиды... Учитесь, мля :)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33940791
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я по-поводу Делегата.
Все здорово, но есль отдельные недостатки:
1) для подключения сторонних библиотек вме равно приходится писать... В случае моего последнего опуса, ежели продолжить специализацию TimerTaskT параметров эдак до 15(TYPELIST_15). То проблема закравается раз и навсегда, все сводится к декларации переменной нужного типа.
2) Приведение к типу void* и обратно. Может больно ударить, когда хочешь передать наследника вместо папы. Приходится писать конструкцию типа
reinterpret_cast<void*>(static_cast<Parent*>(childPtr))
чтобы потом сделать
reinterpret_cast<Parent*>(voidPtr)
Ужас!!! этоже прочесть нельзя. И не говорите мне что в случае отсутствия множественного наследования все пройдет на ура, не пройдет! Сем налетел лет 6 назад, когда портировался под HP aCC. Забавный компилятор, у него папа в наследнике начинается со смещением в слово. Вот вспотел тогда код шерстить....

PS Я не linuxoid, я unixoid. За своб недолгую я попробовал SCO, Linux, Solaris, HP-UX (risk и ia64) и AIX
PSS Спасибо Akh, чоть кому-то что-то пригодилось...
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33940853
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем нужен reinterpret_cast<void*> ?
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33940890
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
описанная тобой проблема, насколько я знаю, возникает только при приведении типов parent<->child
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33941074
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
class Parent1
{
public:
	int p1;
	Parent1(int p): p1(p){}
};

class Parent2
{
public:
	int p2;
	Parent2(int p): p2(p){}
};

class Child: Parent1,Parent2
{
public:
	int c;
	Child(int pc, int p1, int p2): c(pc), Parent1(p1), Parent2(p2){}
};

void Func(void *obj1, void *obj2)
{
	Parent1 *op1=(Parent1*)obj1;
	Parent2 *op2=(Parent2*)obj2;
	_tprintf(TEXT("p1=%i, p2=%i\n"),op1->p1,op2->p2);
}

int _tmain(int argc, _TCHAR* argv[])
{
	Child *c1=new Child( 1 , 2 , 3 ), *c2=new Child( 7 , 8 , 9 );
	Func((Parent1*)c1, (Parent2*)c1);
	Func((Parent1*)c2, (Parent2*)c2);
}
выводит
Код: plaintext
1.
p1=2, p2=3
p1=8, p2=9
и не надо пугать небезопасными привидениями.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33942384
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, TYPELIST_1(P1) - это макрос? Можно на него глянуть? Как он отреагирует на конструкцию с запятыми?
Код: plaintext
TYPELIST_1(void (*)(int,int))
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33942564
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, уж как в том анекдоте : Обосновал, но припохабнейше...Сейчас буду топтать, но сначала про reinterpret_cast - это привычка, я всегда когда из.в void* его пишу, оно при чтении глаз мозолит сразу видно где гадость...
По-поводу приведения:
1) его можно просто забыть или сознательно не написать. Компилятор вам об этом ничего не скажет. Более того в большинстве случаев это сходит с рук.
Согласитесь что множественное наслдование не часто встречается, а при одинарном большинство компиляторов сгенерят работающий код. Так у меня и было пока aCC не встретился. Сами понимаете мало приятного везде "работает", а на HP нет и отметим нигде в доках ничего о особенностях размещении объкта в памяти нет. Результат - несколько часов дебагере а потом еще куча времени чтобы прошерстить массу кода.
2) Привестись можно "неправильно". Что собственно вы и сделали. Приведение типа в стиле С в С++ - семантический маразм, никогда нельзя быть уверенным что приведется правильно. Не верите мне, отсылаю к гуру Дизайн и эволюция языка С++, там целая глава о приведении типа, вам читать с середины главы.
В нашем конкретном случае вы нарушили права доступа к объекту, наследование то у вас private. А завтра выйдет новая версия библиотеки где автор уберет наследование и заменит его делегированием и вас перестанет работать, а компилятор ничего не скажетю А не првы были вы ибо автор библиотеки ничего с публичным интерфейсом не сделал..
Кстати если бы вы написали static_cast то хороший компилятор поймал бы вас за руку. GCC таким не оказался( у меня 3.2) Пришлось intel доставать, он поймал за руку.
А так я не против void*, просто если можно без него обойтись, надо обходится.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33943013
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedА завтра выйдет новая версия библиотеки где автор уберет наследование и заменит его делегированием и вас перестанет работать, а компилятор ничего не скажет. А не првы были вы ибо автор библиотеки ничего с публичным интерфейсом не сделал.это однозначно смена интерфейса (если в терминах COM). И это уже не относится к первоначально указанной тобой проблеме передачи парента.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33943634
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интерфейс - это не просто список методов, это вся иерархия классов.

К тому же, если ты на этих шаблонах напишешь библиотеку, тебе придётся поставлять её в сорсах, что влечёт за собой такой момент, что при любом изменении реализации TimerTaskT, тебе придётся перекомпилировать все модули, где он используется, а как ты помнишь, Akh очень не любит это делать.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33943941
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoAkh очень не любит это делать.

Этточно. ;)

PS: в обсуждение не вникал.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33943999
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhPS: в обсуждение не вникал.если нужна мощная защита от дурака, рекомендуют использовать шаблоны вместо void*
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33944012
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на случай, если ломает писать по делегату на каждую сигнатуру.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33944208
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему пора завязывать. Решать все равно Akh_у. А тема высосана до дна, пусть лучше Akh еще чего-нибудь спросит у него ъто здорово получается.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33945953
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedПо-моему пора завязывать. Решать все равно Akh_у. А тема высосана до дна, пусть лучше Akh еще чего-нибудь спросит у него ъто здорово получается.

Вообще, то я уже давно решил как буду делать, сообщений этак 30 назад. Но читать топик интересно. :)

Спрошу, спрошу. Когда вопросы будут.
...
Рейтинг: 0 / 0
19 сообщений из 94, страница 4 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему нельзя передавать параметром метод класса?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]