2011-06-09 113 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