2011-06-09 54 views
1

我有我的代碼組織爲以下複製指針成員函數從結構

class MyClass 
{ 
public: 
    typedef void (MyClass::Ptr2func)(); 
} 

struct abc 
{ 
    MyClass::Ptr2func ptr; 
    bool result; 
} 

void main() 
{ 
    MyClass myCls; 
    abc var; 
    //here is a lot of decision making code and pointer initializations 

    //I want to copy the pointer to function in another variable 
    MyClass::Ptr2func tempPtr; 
    tempPtr=var.ptr; 
} 

當我嘗試複製var.ptrtempPtr它給了我一個編譯錯誤的參數列表丟失。它也給我編譯錯誤myCls.*(var.ptr());有優先問題嗎?我曾嘗試使用括號,但沒有任何工作。我希望有人能幫助我解決這個問題。

感謝和問候, 薩巴塔西爾

+0

-1不是真正的代碼 – 2014-02-10 13:10:17

回答

2

我認爲,問題是,你的typedef

typedef void (MyClass::Ptr2func)(); 

是不是定義爲一個成員函數指針的類型定義,但對於一個成員函數的類型。成員函數指針的typedef爲

typedef void (MyClass::* Ptr2func)(); 

注意這裏涉及的顯式指針。類型

typedef void (MyClass::Ptr2func)(); 

實際上爲成員函數MyClass內,它沒有參數和返回void類型一個typedef。

關於你的最後一個問題,調用指向一個成員函數正確的語法是(我相信)

(myCls.*var.ptr)() 

請注意,您必須設法調用它的函數之前加上括號表達(myClass.*var.ptr),因爲代碼

myCls.*(var.ptr()) 

手段「解除引用由var.ptr()相對返回指針到部件到對象myCls

希望這有助於!

+0

感謝您的幫助,它真的幫助:) – Saba 2011-06-09 23:11:55

+0

-1由於原始代碼不能編譯,因此沒有什麼「問題」是什麼。另外,教一個完全的新手關於'goto'和'longjmp'是無助的。或者,在這種情況下,成員函數指針。 – 2014-02-10 13:06:18

1

此:

typedef void (MyClass::Ptr2func)(); 

定義了一個函數類型。該定義中的MyClass::是完全無關的;最終的類型是void()。 (爲什麼?你在MyClass的,所以MyClass::將被視爲您想要的typedef Ptr2func屬於MyClass的,不是你想要的類型指定一個成員函數的聲明加固。)

你想這樣的:

typedef void (MyClass::*Ptr2func)(); 

它定義了一個指向成員函數的指針。

+0

你確定'MyClass ::'是無關的嗎?我認爲這很重要,並且意味着「在MyClass中定義的成員函數的類型,它接收並返回」void「。」 – templatetypedef 2011-06-09 21:39:48

+0

@templatetypedef:這意味着,是的,但這種類型在C++中並不存在,據我所知。它必須是一個成員函數的*指針才能作爲一個類型存在。我試圖找到在標準中的參考... – 2011-06-09 21:50:22

+0

啊。是的,這裏有含糊之處。 'MyClass ::'是無關的,因爲'Ptr2func'本身(typedef)是'MyClass ::'的成員。如果將typedef從類中移出,則會出現此錯誤:'錯誤:typedef聲明符不能被限定。我會編輯我的答案。 – 2011-06-09 21:52:58

-2

你在問編譯錯誤。

當我寫這篇文章時,你的代碼在每個類定義後都沒有半角。

此外,幾乎任何其他編譯器比MSVC將對void main作出反應;使用標準int main

作爲一個完全的初學者(犯這些錯誤),使用成員指針並不是一個好主意。

簡而言之,不是解釋你希望通過它實現的目標。

乾杯& hth。

+0

@downvoter:我知道你相信這不是問題的答案。它是。你錯了。請不要低估其他答案,直到您對此反映出來。對此,請不要投票。 – 2014-02-10 13:03:08