0

代码

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. 无效 (*pKoo)(); - 没问题
  2. pKoo = &this->walk; - 编译错误
  3. 无效(猫::* pFoo)();- 没问题
  4. pFoo = &this->walk; - 编译错误;

问题

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

请帮助进行概念解释。谢谢你

4

2 回答 2

2
void (*pKoo)();                
pKoo = &this->walk; 

给你错误,因为函数指针类型与你分配给它的地址的函数类型不匹配。

的类型walk()是:

void (cat::*)(void);

void(cat::*pFoo)();
pKoo = &this->walk; 

应该:

pKoo = &cat::walk;

该方法walk属于该类cat,而不属于该类的任何特定实例。因此,您不能使用this->walk(),但您需要使用类名限定方法名。

于 2012-08-29T09:54:11.090 回答
2

为什么没有2不可能?

我的编译器给出了一条错误消息:

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

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

如果不可能,那1号有什么用?

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

为什么没有3不可能?

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

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

For some reason, you're not allowed to take the address of a member function using an object (or pointer); you have to use the class name instead. We can only speculate on why this isn't allowed; perhaps because it's not entirely clear which override should be chosen if it's virtual, or perhaps for some other reason.

Whatever the reason, use the allowed syntax: pFoo = &cat::walk;

于 2012-08-29T10:24:53.177 回答