1. 程式人生 > >C/C++開發語言系列之20---C++類成員函式指標2

C/C++開發語言系列之20---C++類成員函式指標2

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
 
class Foo
{
    public:
        string m_str;
        Foo()
        {
            m_str = "";
        }
		
		static void testFunc2(int a)
		{
			cout<<"Foo:void testFunc2(int a)"<<endl;
			cout<<a<<endl;
		}
		
		void testFunc4(int a)
		{
			cout<<"Foo:void testFunc4(int a)"<<endl;
			cout<<a<<endl;
		}
		static void testFunc5(int a)
		{
			cout<<"Foo:void testFunc5(int a)"<<endl;
			cout<<a<<endl;
		}
		
		void (*pTestFunc5)(int a);
		void (*pTestFunc6)(int a);
};

void (*pTestFunc1)(int a);
void (*pTestFunc2)(int a);
void (Foo::*pTestFunc3)(int a);
void (Foo::*pTestFunc4)(int a);

void testFunc1(int a)
{
	cout<<"func1 pointer test"<<endl;
	cout<<a<<endl;
}

void testFunc3(int a)
{
	cout<<"func3 pointer test"<<endl;
	cout<<a<<endl;
}

void testFunc6(int a)
{
	cout<<"func6 pointer test"<<endl;
	cout<<a<<endl;
}


int main(int argc, const char *argv[])
{

    Foo foo;
	//foo.test("woo",100);
	
	pTestFunc1 = testFunc1;		//經常用這個方法
	(*pTestFunc1)(1);
	
	 pTestFunc2=&foo.testFunc2;
	(*pTestFunc2)(2);
	
	//pTestFunc3 = &testFunc3;  //編譯器報錯,不可以這麼使用
	
	pTestFunc4 = &Foo::testFunc4; //初始化的時候必須帶有&Foo::

	//pTestFunc4(4);//編譯器報錯,不可以這麼使用
	//foo.pTestFunc4(4);//編譯器報錯,不可以這麼使用
	//foo.*pTestFunc4(4);//編譯器報錯,不可以這麼使用
	//foo.(*pTestFunc4)(4);//編譯器報錯,不可以這麼使用
	(foo.*pTestFunc4)(4);	//正常執行
	
	foo.pTestFunc5=&Foo::testFunc5;
	foo.pTestFunc5(5);
	
	foo.pTestFunc6=&testFunc6;
	foo.pTestFunc6(6);
	
    return 0;
}