LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 962|回复: 3

about function pointer in c++

[复制链接]
发表于 2005-7-21 13:01:11 | 显示全部楼层 |阅读模式
I have a program in c++

in myclass.h


  1. class MyClass
  2. {
  3. public:
  4.      MyClass();
  5.      struct test_struct
  6.      {
  7.         //a is an array
  8.         double *a;
  9.         //sigma is a function pointer point to a member function of MyClass
  10.         double (*sigma)(int, int);
  11.      };
  12.      
  13.      void use_struct_example();

  14. private:
  15.      double somefunction(int, int);
  16. }

  17. in myclass.cpp

  18. [CODE]
  19. //constructor
  20. MyClass::MyClass()
  21. {
  22. }

  23. MyClass::use_struct_example()
  24. {
  25.      test_struct  ts;
  26.      int myarray[5] = {1,2,3,4,5};
  27.      ts.a = myarray;
  28.      ts.sigma = &MyClass::somefunction;

  29.      //some other operation here.....
  30. }
  31. MyClass::somefunction(int a, int b)
  32. {
  33. }
复制代码


when compile this program, there are two error reported by compiler:
first one is ISO C++ forbids taking the address of an unqualified non-static member function to form a pointer to member function.
second one is can not convert from type MyClass:: to type double.....

is there any one can explain how funciton pointer can be used in c++, particularly when you are in the situaion that you have to use a library that written in C, and in your c++ code, you have to pass a member function's address to a struct member, which obviously also written in C, encoded in that library.....

any attempts to solove my problem is much appreciated....
发表于 2005-7-21 15:21:31 | 显示全部楼层
这个……
调用c++类里面的非静态成员函数,跟普通的函数不一样,有可能会多传一个参数(如gcc),有可能在某个寄存器里面放置一个值(如vc)(这个多加的一个参数,应该已经猜出来了,就是this)。所以呢,也不能像其他的函数指针那样操作类成员函数。stl 或者 boost 库(记不得是哪个了,说不定是两个)好象有对成员函数操作的封装,有兴趣可以参考参考
回复 支持 反对

使用道具 举报

发表于 2005-7-25 13:28:56 | 显示全部楼层
楼上正解。
不过把你的somefunction声明为static member function就可以了。

这个问题和为什么普通成员函数不能作为回调函数一个解释
回复 支持 反对

使用道具 举报

发表于 2005-7-25 15:31:15 | 显示全部楼层
楼主,我查了一下资料,改了一下你的代码,可以跑了.主要就是要知道在c++中指向成员函数的指针在定义和调用时都要有作用域。

#include <iostream>

using namespace std;
class MyClass
{
public:
     MyClass();
     struct test_struct
     {
        //a is an array
         int *a;
        //sigma is a function pointer point to a member function of MyClass
         double (MyClass::*sigma)(int, int);
     };
     
     void use_struct_example();

private:
     double somefunction(int, int);
};

MyClass::MyClass()
{
}     

void MyClass::use_struct_example()
{
     test_struct  ts;
     int myarray[5] = {1,2,3,4,5};
     ts.a = myarray;
     ts.sigma = &MyClass::somefunction;
     (this->*(ts.sigma))(0,1);
     
}
double MyClass::somefunction(int a, int b)
{
   
    cout<<a<<b<<endl;
}
int main()
{
    int aa;
    MyClass a;
    a.use_struct_example();
    return 0;
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表