1. 程式人生 > >static函式 函式呼叫缺少引數列表;請使用“&XXX”建立指向成員的指標;類的static成員函式

static函式 函式呼叫缺少引數列表;請使用“&XXX”建立指向成員的指標;類的static成員函式

如下:

#include <stdio.h>

typedef int ( *FUNC )( void *param );

class CA
{
public:
	CA();
	void init(FUNC fun){};
};

class CB
{
public:
	CA A;
	int B_fun(void *param)
	{
		return 0;
	}
public:
	void test()
	{
		A.init(B_fun);
	}
};

int main()
{
	return 0;
}

編譯出錯:

>  正在對“Debug\Temptest.unsuccessfulbuild”執行 Touch 任務。
1>ClCompile:
1>  main.cpp
1>e:\test\temptest\temptest\main.cpp(23): error C3867: “CB::B_fun”: 函式呼叫缺少引數列表;請使用“&CB::B_fun”建立指向成員的指標


正確修改:

#include <stdio.h>

typedef int ( *FUNC )( void *param );

class CA
{
public:
	CA();
	void init(FUNC fun){};
};

class CB
{
public:
	CA A;
	static int B_fun(void *param)
	{
		return 0;
	}
public:
	void test()
	{
		A.init(B_fun);
	}
};

int main()
{
	return 0;
}

或者把B_fun改成全域性函式,不屬於該類就行。

錯誤原因是:靜態成員函式的地址可用普通函式指標儲存,而普通成員函式地址需要用類成員函式指標來儲存,

因為普通成員函式要執行時我們必須要確定他是屬於哪個類物件才能執行而類的static函式是不屬於這個類的,他是在編譯器編譯時期就已經確定的,普通成員函式是在有了類物件之後才能執行。

typedef void (*b)();
class A{ 
public:		
	static void func1();
	void func2();
	void fun()
	{
		b myfunc1 = func1;  //valid  
		b myfunc2 = func2;   //error   傳指標func2和呼叫func2()是不一樣的
	}
};
類的成員函式指標作為引數傳遞給其他函式和普通函式指標的傳遞是不同的,普通函式指標的傳遞
只要在引數宣告中宣告是相同引數個數、型別和相同返回型別的函式指標int (*p)(int),傳遞時只需傳函式名就可以了。可是傳遞成員函式指標用此方法卻不能工作。指標是指向一些記憶體地址的變數,既可以是資料的地址也可以是函式的地址。C++的 成員指標遵從同樣的原則。但在類內部沒有地址;選擇一個類的成員意味著在類中偏移。只有把這個偏移和具體物件的開始地址結合,才能得到實際地址。成員指標的語法要求選擇一個物件的同時逆向引用成員指標。

當然,可以把成員函式宣告為static(靜態函式),這樣傳遞它的指標就像傳遞普通函式一樣。