c++ - 是否有可能 'member function pointer' 指向同一类中的成员函数

标签 c++ pointers function-pointers

代码

class cat{

        public:
           void walk(){
                printf("cat is walking \n");
           }

           void myAbc(){
               void (*pKoo)();
               pKoo = &this->walk;
           }

          void myDef(){
               void(cat::*pFoo)();
               pFoo = &this->walk;
          }
        }

    };

结果

  1. void (*pKoo)(); - 没问题
  2. pKoo = &this->walk; - 编译错误
  3. void(cat::*pFoo)(); - 没问题
  4. pFoo = &this->walk; - 编译错误;

问题

  • 为什么没有 2 个不可能?如果不可能,那1号有什么用?
  • 为什么没有 4 个不可能?如果不可能,那 3 号有什么用?

请帮忙解释概念。谢谢

最佳答案

Why no 2 impossible?

我的编译器给出错误信息:

cannot convert ‘void (cat::*)()’ to ‘void (*)()’ in assignment

这意味着您不能将指向成员函数的指针转换为指向函数的指针。它们是不兼容的类型;指向函数的指针可以直接调用,而指向成员函数的指针需要应用于对象。因此,您分配给的类型必须是指向成员函数的指针,或 void (cat::*)();,正如您在 3 中正确使用的那样。

If Impossible, Then what is the use of No 1?

它用于存储指向静态或非成员函数的指针。

Why no 3 impossible?

(我假设你的意思是 4,而不是 3。)我的编译器给出了一条错误消息:

ISO C++ forbids taking the address of a bound member function to form a 
pointer to member function.  Say ‘&cat::walk’

出于某种原因,不允许使用对象(或指针)获取成员函数的地址;您必须改用类名。我们只能推测为什么不允许这样做;可能是因为不完全清楚应该选择哪个覆盖(如果它是虚拟的),或者可能出于其他原因。

无论出于何种原因,请使用允许的语法:pFoo = &cat::walk;

关于c++ - 是否有可能 'member function pointer' 指向同一类中的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12175194/

相关文章:

c - 我的程序在某些情况下似乎无法分隔单词

c++ - 在没有 typedef 的情况下使用时显示编译错误的函数的 volatile 指针;需要帮助 w/"void (* volatile userFunc)(void)"

c++ - 传一个容器给priority_queue有什么用

c++ - 继承、指针和软件架构

c++ - 模板继承 - 分配失败

c++ - 我应该存储整个对象还是指向容器中对象的指针?

c++,对每个数组成员执行函数

c - 共享相同变量的结构的函数指针

c++ - 使用 malloc() 和 free() 实现一个简单的分配器类

c++ - Qt QTableView 实现切换按钮和复选框委托(delegate)