Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Вникать во все это неохота. Но, сдается мне, что ты хочешь чтоб для объекта m_timer вызывалась функция OnTimer совершенно другого класса.
Да нет, CWaitChoice нужет только потому что CTimer является частью библиотеки ufoLib где у всех классов потомком является CObject. По этой причине написать просто так:
...нельзя Choice error C2440: 'type cast' : cannot convert from 'void (__cdecl *)(ufo::CObject *)' to 'ufo::TNotifyEvent' нужен класс контейнер от CObject.
просто вся фигня в том что внутри OnTimer члены класса берутся не понятно от куда и их лубые изминенеия не как не отражаются на самом классе. Если смотреть по дебагеру то пулячается следуещие:
Адрес this класса CWaitChoice 0x0012fdd4
Адрес this класса CTimer 0x0012fde0
Гогда вызываем void CWaitChoice::OnTimer, this должен быть 0x0012fdd4, а он 0x0012fde0.
Я грешу на:
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Вникать во все это неохота. Но, сдается мне, что ты хочешь чтоб для объекта m_timer вызывалась функция OnTimer совершенно другого класса.
Сорри... чего-то я торможу...
Да все верно именно это мне и нужно....
-= The Alien//Ufocomp =-
Re[7]: Как вызвать переменную объявленную как функция?
Еще раз.
Есть
CObject CObject
| |
CTimer CWaitChoice
У CWaitChoice есть функция OnTimer(), которая обращается к членам этого класса
Ты, преобразовывая указатель на член-функцию (кстати, адрес ее берется так &CWaitChoice::OnTimer), хочешь писать (m_Timer.*OnTimer)() ???? Но ведь у твоего CTimer нет тех членов, с которыми работает CWaitChoice::OnTimer ?
Of course, the code must be complete enough to compile and link.
Re[8]: Как вызвать переменную объявленную как функция?
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Еще раз. L_L>Есть L_L>CObject CObject L_L> | | L_L>CTimer CWaitChoice
L_L>У CWaitChoice есть функция OnTimer(), которая обращается к членам этого класса L_L>Ты, преобразовывая указатель на член-функцию (кстати, адрес ее берется так &CWaitChoice::OnTimer), хочешь писать (m_Timer.*OnTimer)() ???? Но ведь у твоего CTimer нет тех членов, с которыми работает CWaitChoice::OnTimer ?
Есть CTimer от CObject
есть CWaitChoice от CObject
И когда вызывается CWaitChoice::OnTimer(CObject* Sender) то m_CallCount не равна 0 как должно выть она вообще не от мира сего... и соответственно чтобы я не делал с членами класса CWaitChoice внутри CWaitChoice::OnTimer на сам класс CWaitChoice это не как не отражается. Вот такая вот херня...
-= The Alien//Ufocomp =-
Re[9]: Как вызвать переменную объявленную как функция?
A>void CTimer::Timer(void)
A>{
A> if ( m_OnTimer != NULL )
A> (this->*m_OnTimer)(this);
A>};
A>
A>И когда вызывается CWaitChoice::OnTimer(CObject* Sender) то m_CallCount не равна 0 как должно выть она вообще не от мира сего... и соответственно чтобы я не делал с членами класса CWaitChoice внутри CWaitChoice::OnTimer на сам класс CWaitChoice это не как не отражается. Вот такая вот херня...
Вызывать m_OnTimer можно только у объектов типа CWaitChoice (после присвоения m_Timer.OnTimer = (TNotifyEvent) OnTimer
А ты пишешь (this->*m_OnTimer)(this); где this -- типа CTimer.
Вороятно тебе нужно
либо еще рядом с m_OnTimer запоминать адрес объекта, у которого надо вызвать эту функцию (если они в принципе возможны разных типов),
либо завести предка (интерфейс) с виртуальной функцией OnTimer, и хранить не m_OnTimer, а указатель на объект, котрый реализует этот интерфейс (функциею OnTimer)
Re[11]: Как вызвать переменную объявленную как функция?
Все дело в неправильном дизайне?
Эх, попробую так объяснить.
class Base{};
class Der1:public Base{};
class Der2:public Base
{
public:
Der2():i_(0)
{
}
void fun()
{
++i_;
}
void fun1()
{
(d_.*static_cast<void (Base::*)()>(&::Der2::fun))();//***
}
private:
int i_;
Der1 d_;
};
Это то, что ты хотел, не так ли?
Ну так вот, класс Base и Derived — пустые (размер их, допустим, 1 байт).
Ты преобразовал указатели т.д. и т.п и вызываешь функцию.
Твоя функция в *** получает указатель this, который указывает вовсе не на объект Der2, но ты пытаешься менять значение несуществующего целого числа. Не так ли?
Of course, the code must be complete enough to compile and link.
Re[12]: Как вызвать переменную объявленную как функция?
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Все дело в неправильном дизайне?
Не думаю, дизайнеры Borland!
L_L>Это то, что ты хотел, не так ли?
В целом да но реализация иная...
L_L>Твоя функция в *** получает указатель this, который указывает вовсе не на объект Der2, но ты пытаешься менять значение несуществующего целого числа. Не так ли?
Дело не в this я его просто передаю, далее не работаю с ним!!!
Еще раз и наверное последний, а то я совсем не въезжаю...
Что мне надо?
есть
class Base{};
typedef void (Base::* NE)(Base* S);
class Der1:public Base
{
protected:
virtual TT(void)
{
(this->*T)(this);
};
public:
NE T;
};
class Der2:public Base
{
private:
int i;
Der1 d;
public:
Der2():i(0)
{
d.T = (NE) fun;
}
void fun()
{
++i;
}
int GetI(void)
{
return i;
}
};
// Далее
Der2 der2;
// TT вызывается через API как не важно... предположим вызвал 10 раз что будет здесь?:
cout << der2.GetI << endl;
// я могу сразу сказать что будет: 0
-= The Alien//Ufocomp =-
Re[13]: Как вызвать переменную объявленную как функция?
Здравствуйте, alienufo, Вы писали:
A>Не думаю, дизайнеры Borland!
BCB Это самый поганый компилятор из тех что я видел. Буквально сегодня пол дня ловил AV на пустом месте... оказалось что конструктор по умолчанию basic_string вошол в бесконечную рекурсию и выжрал весь стек но в место переполнения стека вылетело AV по 0.... Благо замена на AnsiString подходила без особого гемороя.
Да и VCL на дельфих написана.... а С++ не дельфя и что нормально для дельфи очень криво для С++.
A>Еще раз и наверное последний, а то я совсем не въезжаю...
Так работать не будет по определению.
Завтра доберусь до билдера посмотрю что тебе может помочь.
A>// я могу сразу сказать что будет: 0
А я могу сказать что гдето память испортилась, а AV по случайности не вылетел.
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн