类成员变量是一个函数指针,指向这个类的一个成员函数,可以这样吗?

brucewoo 2017-02-15 10:58:54
大家好,有个比较纠结的问题。

我知道在外部可以使用函数指针来调用一个类的成员函数,但我的问题是,可否在一个类中声明一个函数指针,然后这个指针指向自己这个类中的某个成员函数?
我试了老半天都失败了,网上搜到的信息都没有关于这种情况的,只有外部调用的那种情况。

试验代码,如下: (编译环境是Arduino IDE)


class mytest
{
public:

void(*fp)(); //一个成员变量,用来指向类内成员函数

void run()
{

fp=func1;
fp();
};


void func1()
{
Serial.println("This is func1 !");
};
void func2()
{
Serial.println("This is func2 !");
};

};
//=============以上是类定义===================

mytest mytest1;

void setup() {

Serial.begin(9600);
}

void loop() {

mytest1.run();
delay(1000);
}

//=============以上是Arduino主程序===================


编译给出的错误信息是:

main:14: error: cannot convert 'mytest::func1' from type 'void (mytest:()' to type 'void (*)()'

exit status 1
cannot convert 'mytest::func1' from type 'void (mytest:()' to type 'void (*)()'

百思不得其解,是我写错了,还是C++根本就不允许这样的操作?
...全文
527 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
brucewoo 2017-02-16
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
void(MyTest::*fp)(); 这样子使用,非static成员函数指针跟其他函数指针是不同的,必须用类作用域限定
你好,按照您的建议修改了,依然没法编译,代码如下:

class mytest
{
  public:
  
 void(mytest::*fp)(); //一个成员变量,用来指向类内成员函数

  void run()
  {

    fp=func1;
    fp();
  };


    void func1()
  {
    Serial.println("This is func1 !");
   };
  void func2()
  {
    Serial.println("This is func2 !");
  };
 
};
编译器给出的错误信息是: error: cannot convert 'mytest::func1' from type 'void (mytest::)()' to type 'void (*)()' 请帮忙再看一下,谢谢。
brucewoo 2017-02-16
  • 打赏
  • 举报
回复
感谢 jianwen0529 和 xsklld 两位的回答! 经过9楼所述的修改后,两种方法都可以编译运行了。 在网上搜索关于类成员函数指针时,都没有提及这种成员指针指向成员函数的情况,是不是这种用法没什么意义呢? 至少从这个例子看到,这种情况下的使用对格式有严格的要求。 方便大家,总结一下两种方法: 方法一:
void(mytest::*fp)(); //一个成员变量,指针,用来指向类内成员函数
    fp = &mytest::func2; //对该指针赋值
    (this->*fp)(); //使用该指针指向的函数
方法二:
  typedef void(mytest::*fptype)();  //定义一个类型,指针,用来指向类内成员函数
    fptype fp = &mytest::func2; //定义改类型的实例,并赋值
    (this->*fp)();//使用该指针指向的函数
幻夢之葉 2017-02-16
  • 打赏
  • 举报
回复
引用 6 楼 brucewoo 的回复:
main:20: error: '((mytest*)this)->mytest::fp' cannot be used as a member pointer, since it is of type 'void (*)()' exit status 1 cannot convert 'void (mytest::*)()' to 'void (*)()' in assignment
你这个得先修改 void(*fp)(); //一个成员变量,用来指向类内成员函数 为 void(mytest::*fp)(); //一个成员变量,用来指向类内成员函数
引用 7 楼 brucewoo 的回复:
错误信息: must use '.*' or '->*' to call pointer-to-member function in 'pfunc (...)', e.g. '(... ->* pfunc) (...)'
(this->*pfunc)(); //换成这样子试试
ESMGAL 2017-02-16
  • 打赏
  • 举报
回复
之所以没有人这么弄是因为类里面有this指针。
brucewoo 2017-02-16
  • 打赏
  • 举报
回复
引用 5 楼 jianwen0529 的回复:
如4L的形式,或者以下方式

typedef void(mytest::*fp)();  //定义函数指针类型

fp pfunc = &mytest::func1;
fp();
你好,编译还是报错,请帮忙看一下我是不是哪里搞错了。

class mytest
{
  public:
  
  //void(*fp)(); //一个成员变量,用来指向类内成员函数
  typedef void(mytest::*fp)(); 
  void run();
  void func1();
  void func2();
};
//================cpp=================

 void mytest:: run()
  {
    //fp=func1;
    //fp = &mytest::func1;
    fp pfunc = &mytest::func1;
    //fp();
    //(this->*fp)();
    pfunc();
    
  };
    void mytest:: func1()
  {
    Serial.println("This is func1 !");
   };
   void mytest:: func2()
  {
    Serial.println("This is func2 !");
  };
错误信息: must use '.*' or '->*' to call pointer-to-member function in 'pfunc (...)', e.g. '(... ->* pfunc) (...)'
brucewoo 2017-02-16
  • 打赏
  • 举报
回复
引用 4 楼 xsklld 的回复:

fp = &mytest::func1;
(this->*fp)();
你好,编译器还是给出一样的错误信息,请帮忙看一下我这样写的有没有错:

class mytest
{
  public:
  
  void(*fp)(); //一个成员变量,用来指向类内成员函数
  void run();
  void func1();
  void func2();
};
//================cpp=================


 void mytest:: run()
  {
    //fp=func1;
    fp = &mytest::func1;
    //fp();
    (this->*fp)();
  };
    void mytest:: func1()
  {
    Serial.println("This is func1 !");
   };
   void mytest:: func2()
  {
    Serial.println("This is func2 !");
  };
错误信息: main:18: error: cannot convert 'void (mytest::*)()' to 'void (*)()' in assignment main:20: error: '((mytest*)this)->mytest::fp' cannot be used as a member pointer, since it is of type 'void (*)()' exit status 1 cannot convert 'void (mytest::*)()' to 'void (*)()' in assignment
幻夢之葉 2017-02-16
  • 打赏
  • 举报
回复
如4L的形式,或者以下方式

typedef void(mytest::*fp)();  //定义函数指针类型

fp pfunc = &mytest::func1;
fp();
xskxzr 2017-02-16
  • 打赏
  • 举报
回复

fp = &mytest::func1;
(this->*fp)();
幻夢之葉 2017-02-15
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
void(MyTest::*fp)(); 这样子使用,非static成员函数指针跟其他函数指针是不同的,必须用类作用域限定
具体原因可以参考 http://blog.csdn.net/icycode/article/details/6758636
幻夢之葉 2017-02-15
  • 打赏
  • 举报
回复
void(MyTest::*fp)(); 这样子使用,非static成员函数指针跟其他函数指针是不同的,必须用类作用域限定

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧