【问题标题】:c++ pointer to function assignmentc++ 指向函数赋值的指针
【发布时间】:2013-06-26 14:34:54
【问题描述】:

如果我有:

class MyClass {
 ...... my code....
private:
 void myFunction(int p);

}

in cpp file:

MyClass::MyClass() {

void (*pointer)(int);
pointer = &myFunction;

}

MyClass::myFunction(int p) {
//.... my code .... //
}

这可能吗? 我有一个分配问题:

cannot convert 'void(MyClass::*)(int)' to 'void (*)(int)' in assignment

【问题讨论】:

  • 编译器给了你一个很好的提示:指向该成员函数的指针的类型是void(MyClass::*)(int)

标签: c++ pointers function-pointers


【解决方案1】:

你需要像这样 typedef 一个指针类型:

typedef void (MyClass::*FnPointer)(int);

并像这样创建该类型的指针:

FnPointer pnt = &MyClass::myFunction;

函数可以这样调用:

MyClass obj;
(obj.*pnt)( 3 );

我不知道 OP 是否有目标,或者只是在玩,但这种方法对于创建回调或委托很有用。一个结构将保存并使用指向类实例的引用或指针以及指向该类的成员函数的指针进行初始化。

见:What is a C++ delegate?

【讨论】:

  • +1 但是调用如何工作?何时访问任何其他类变量?
  • 好的,现在我必须在另一个对象的构造函数中传递这个指针:我应该如何声明这个构造函数:MySecondClass (FnPointer myPointer)??
  • 一旦你声明了 typedef,就会有一个名为 FnPointertype 表示“指向作为 MyClass 成员的函数的指针”。像使用任何其他类型一样使用它。或者换一种说法:是的。 :-)
  • 你确定 (obj.*pnt)( 3 );是正确的?我使用 (this->*pnt)(3);但我有一个编译错误:指向成员类型“void(MyDataTypes::MyClass::)(int)”的指针与对象类型“MySecondClass”不兼容 MySecondClass 是我使用指针的类
  • 你需要编辑你的问题来填写这个额外的细节,但是,如果你要调用一个定义为MyClass成员的函数指针,你需要在一个实例上调用它MyClass.
【解决方案2】:

实际上,错误消息非常有助于告诉您出了什么问题。你声明了 function 指针,但你必须声明 method 指针。

在类的声明中尝试typedef void (*pointer)(int);,然后通过MyClass::pointer引用类型。

【讨论】:

    【解决方案3】:

    除非您利用它们的实现细节并使用 reinterpret_cast,否则方法指针是毫无用处的。如果您真的想这样做,请参阅http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible

    现在,如果您正在运行 c++11,您可以使用 lambda 函数来执行此操作。您可以使用std::function<void(int)> pointer;auto pointer = <the lambda>,而不是void (*pointer)(int);

    现在,您将使用 [&this](int a){return this->myFunction(a);};,而不是 &myFunction&MyClass::myFunction。然后,您可以将其分配给 std::function 变量或类型推断变量(使用 auto)。

    【讨论】:

    • 请解释为什么您认为指向成员函数的指针“毫无用处”。
    • 查看代码项目链接!本质上,它们指向一个类的方法,并且仅指向该类,并且您需要该类的实例来调用它们。因为作者看起来他想将一个成员函数分配给一个常规的旧函数指针,我打赌他关心函数参数类型和返回类型,而不是它属于哪个类。
    • 我读过这篇文章,其中很大一部分是废话和误导 作者错误地引用了标准,似乎对为什么事情是这样的有很多误解他们的样子。那或者他只是忽略了它们,以努力为他的文章提供推理。他甚至向 Rambo 介绍未定义行为的各个方面,但在他的代码中依赖它。如果在 SO 上发布类似的内容,它将被粉碎。
    • 是的,这是一种非常不安全的方法,但我敢打赌,周围的一些委托库中使用了一些类似的方法。真的没有理由在现代 C++ 中做这些事情。它/确实/很好地解释了为什么成员指针是它们的方式背后的原因。
    • 这篇文章充满了误解和事实错误。它在解释指向成员函数的指针的细节方面做得非常差。
    猜你喜欢
    • 2011-07-06
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    相关资源
    最近更新 更多