Mixing C & C++. Function pointer.
От: Аноним  
Дата: 03.08.05 06:09
Оценка:
Есть такая структура на С:
typedef void (*Function)(int param);

struct A
{
    Function function;
};

и C++ класс:
class B
{
public:
    void functionX(int param);
};

Подскажите, пожалуйста, как можно присвоить function functionX из класса B?
void RegisterX(B* b)
{
    A a;
    a.function = b->functionX; //ERROR
}
Re: Mixing C & C++. Function pointer.
От: LuciferMoscow Россия  
Дата: 03.08.05 06:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть такая структура на С:

А>
А>typedef void (*Function)(int param);

А>struct A
А>{
А>    Function function;
А>};
А>

А>и C++ класс:
А>
А>class B
А>{
А>public:
А>    void functionX(int param);
А>};
А>

А>Подскажите, пожалуйста, как можно присвоить function functionX из класса B?
А>
А>void RegisterX(B* b)
А>{
А>    A a;
А>    a.function = b->functionX; //ERROR
А>}
А>

Никак. У этих переменных разные типы. B::functionX имеет ДВА параметра(один из них неявный аргумент this)
Re: Mixing C & C++. Function pointer.
От: gbt Россия  
Дата: 03.08.05 06:28
Оценка: 2 (1) -1
Здравствуйте, Аноним, Вы писали:

А>Есть такая структура на С:

А>
А>typedef void (*Function)(int param);

А>struct A
А>{
А>    Function function;
А>};
А>

А>и C++ класс:
А>
А>class B
А>{
А>public:
А>    static void functionX(int param);
А>};
А>

А>Подскажите, пожалуйста, как можно присвоить function functionX из класса B?
Только если сделать метод статическим, тогда он действительно может принимать один аргумент.
Если же нужно вызывать нестатический метод, то придется изменить многое:
typedef void (*Function)(void * inst, int param);

struct A
{
    Function function;
};


class B
{
public:
    static void functionX_(void * inst, int param) { static_cast<B *>(inst)->functionX(param); }
    void functionX(int param);
};
[/code]

[ccode]
  A a;
  B b;
  a.function = b.functionX_;
  a.function(&b, 123);
Re[2]: Mixing C & C++. Function pointer.
От: Аноним  
Дата: 03.08.05 06:44
Оценка:
Здравствуйте, gbt, Вы писали:

gbt>Только если сделать метод статическим, тогда он действительно может принимать один аргумент.


Спасибо! Сделал статическим.
Re[2]: Mixing C & C++. Function pointer.
От: jedi Мухосранск  
Дата: 03.08.05 06:53
Оценка:
Здравствуйте, gbt, Вы писали:

А>>Подскажите, пожалуйста, как можно присвоить function functionX из класса B?

gbt>Только если сделать метод статическим, тогда он действительно может принимать один аргумент.
gbt>Если же нужно вызывать нестатический метод, то придется изменить многое:
gbt>
gbt>typedef void (*Function)(void * inst, int param);

gbt>struct A
gbt>{
gbt>    Function function;
gbt>};
gbt>


gbt>
gbt>class B
gbt>{
gbt>public:
gbt>    static void functionX_(void * inst, int param) { static_cast<B *>(inst)->functionX(param); }
gbt>    void functionX(int param);
gbt>};
gbt>[/code]

gbt>[ccode]
gbt>  A a;
gbt>  B b;
gbt>  a.function = b.functionX_;
gbt>  a.function(&b, 123);
gbt>


НЕ нужно давать такие советы
Re[3]: Mixing C & C++. Function pointer.
От: gbt Россия  
Дата: 03.08.05 07:00
Оценка:
Здравствуйте, jedi, Вы писали:

gbt>>
gbt>>typedef void (*Function)(void * inst, int param);

gbt>>struct A
gbt>>{
gbt>>    Function function;
gbt>>};
gbt>>


gbt>>
gbt>>class B
gbt>>{
gbt>>public:
gbt>>    static void functionX_(void * inst, int param) { static_cast<B *>(inst)->functionX(param); }
gbt>>    void functionX(int param);
gbt>>};
gbt>>


gbt>>
gbt>>  A a;
gbt>>  B b;
gbt>>  a.function = b.functionX_;
gbt>>  a.function(&b, 123);
gbt>>


J>НЕ нужно давать такие советы

Да, с форматированием накосячил или вы про что?
Re: Mixing C & C++. Function pointer.
От: SergeyL Россия  
Дата: 03.08.05 07:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть такая структура на С:

А>
А>typedef void (*Function)(int param);

А>struct A
А>{
А>    Function function;
А>};
А>

А>и C++ класс:
А>
А>class B
А>{
А>public:
А>    void functionX(int param);
А>};
А>

А>Подскажите, пожалуйста, как можно присвоить function functionX из класса B?
А>
А>void RegisterX(B* b)
А>{
А>    A a;
А>    a.function = b->functionX; //ERROR
А>}
А>



А разве не так надо?

//определили
typedef void (B::*Function)(int param);
//присвоили
a.function = &(B::functionX);
//вызвали
(b->*(function))(param);
Re[2]: Mixing C & C++. Function pointer.
От: Сергей Зизев Украина  
Дата: 03.08.05 07:29
Оценка:
Hello, SergeyL!
You wrote on Wed, 03 Aug 2005 07:17:59 GMT:

S> Здравствуйте, Аноним, Вы писали:


А>> Есть такая структура на С:
[skipped...]

S> А разве не так надо?


S> [code]

S> //определили
S> typedef void (B::*Function)(int param);
Ключевым здесь является, то что у автора структура на C

With best regards, Sergey Zizyov. E-mail: ziserg@despammed.com
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.