读书人

成员函数指针,该怎么处理

发布时间: 2013-01-28 11:49:56 作者: rapoo

成员函数指针
#include <iostream>
using namespace std;
class Mammal
{
public:
Mammal():itsAge(1){}
virtual ~Mammal(){}
virtual void Speak()const=0;
virtual void Move()const=0;
protected:
int itsAge;
};
class Dog:public Mammal
{
public:
void Speak()const{cout<<"Woof!"<<endl;}
void Move()const{cout<<"Walking to heel.."<<endl;}

};
class Horse :public Mammal
{
public:
void Speak()const{cout<<"Winnie"<<endl;}
void Move()const{cout<<"Galloping.."<<endl;}
};
class Cat:public Mammal
{
public:
void Speak()const{cout<<"Miao"<<endl;}
void Move()const{cout<<cout<<"slinking..."<<endl;}

};
int main()
{
void (*pFunc)()const=0;
Mammal *ptr=0;
int Animal;
int metod;
bool fQuit=false;
while (fQuit==false)
{
cout<<"(0)Quit (1)dog (2)Cat (3)horse:"<<endl;
cin>>Animal;
switch(Animal)
{
case 1:ptr =new Dog;break;
case 2:ptr=new Cat;break;
case 3:ptr=new Horse;break;
default:fQuit=true;break;
}
if (fQuit==false)
{
cout<<"(1)Speak (2)Move"<<endl;
cin>>metod;
switch(metod)
{
case 1:pFunc=Mammal::Speak();break;
default:pFunc=Mammal::Move();break;
}
(ptr ->*pFunc)();
delete ptr;
}
}
return 0;

}
报错:
>e:\c++\learn\test\test\001.cpp(57) : error C2352: “Mammal::Speak”: 非静态成员函数的非法调用
1> e:\c++\learn\test\test\001.cpp(8) : 参见“Mammal::Speak”的声明
1>e:\c++\learn\test\test\001.cpp(58) : error C2352: “Mammal::Move”: 非静态成员函数的非法调用
1> e:\c++\learn\test\test\001.cpp(9) : 参见“Mammal::Move”的声明
1>e:\c++\learn\test\test\001.cpp(60) : error C2039: “pFunc”: 不是“Mammal”的成员
1> e:\c++\learn\test\test\001.cpp(4) : 参见“Mammal”的声明
1>生成日志保存在“file://e:\C++\learn\Test\Test\Debug\BuildLog.htm”
1>Test - 3 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

[解决办法]

#include <iostream>
using namespace std;
class Mammal
{
public:
Mammal():itsAge(1){}
virtual ~Mammal(){}
virtual void Speak()const=0;
virtual void Move()const=0;
protected:
int itsAge;
};
class Dog:public Mammal
{
public:
void Speak()const{cout<<"Woof!"<<endl;}
void Move()const{cout<<"Walking to heel.."<<endl;}

};
class Horse :public Mammal
{
public:
void Speak()const{cout<<"Winnie"<<endl;}
void Move()const{cout<<"Galloping.."<<endl;}
};
class Cat:public Mammal
{
public:
void Speak()const{cout<<"Miao"<<endl;}
void Move()const{cout<<cout<<"slinking..."<<endl;}

};
int main()
{
void (Mammal::*pFunc)()const=0;//这里
Mammal *ptr=0;


int Animal;
int metod;
bool fQuit=false;
while (fQuit==false)
{
cout<<"(0)Quit (1)dog (2)Cat (3)horse:"<<endl;
cin>>Animal;
switch(Animal)
{
case 1:ptr =new Dog;break;
case 2:ptr=new Cat;break;
case 3:ptr=new Horse;break;
default:fQuit=true;break;
}
if (fQuit==false)
{
cout<<"(1)Speak (2)Move"<<endl;
cin>>metod;
switch(metod)
{
case 1:pFunc=&Mammal::Speak;break;//这里
default:pFunc=&Mammal::Move;break;//
}
(ptr ->*pFunc)();
delete ptr;
}
}
return 0;

}


[解决办法]
Mammal::pFunc才是成员函数指针
pFunc 它只是函数指针。

函数指针要求函数参数相同,
而成员函数第一个参数是隐藏的this

读书人网 >C++

热点推荐