【问题标题】:Error in calling a pointer to member function调用指向成员函数的指针时出错
【发布时间】:2019-06-13 13:08:50
【问题描述】:

我创建了一个具有成员函数的类和一个结构,该结构具有指向成员函数的函数指针作为属性。我已经用成员函数的地址初始化了结构。然后我在主函数中为该类创建了一个对象,并通过“(-> *)”调用了指向成员函数的指针。但是它失败了,错误提示“错误:'正确的操作数'没有在这个范围内声明”

//Header
#ifndef A_H
#define A_H

class A
{
    public:
    typedef struct
    {
        void (A::*fptr) ();
    }test;

    test t;

    public:
        A();
        virtual ~A();
        void display();
    protected:

    private:
};
#endif // A_H


//A.cpp
#include "A.h"
#include <iostream>

using namespace std;

A::A()
{
    t.fptr = &A::display;
}

A::~A()
{
    //dtor
}

void A::display()
{
    cout << "A::Display function invoked" << endl;
}

//Main

#include <iostream>
#include "A.h"

using namespace std;

int main()
{
    cout << "Pointer to Member Function!" << endl;

    A *obj = new A;

    (obj->*t.fptr)();

    return 0;
}

||=== 构建:在 fptr 中调试(编译器:GNU GCC 编译器)===|在 函数'int main()':|错误:未在此范围内声明“t”| ||=== 构建失败:1 个错误,0 个警告(0 分钟,1 秒)===|

【问题讨论】:

  • 制作更简单的示例以使用新语法。并在指向函数成员的指针之前尝试指向数据成员的指针。
  • 函数指针声明是一团糟,除非您使用 using void_func = void (A::*) (void); 中的别名 我不得不承认,我不太了解您对 test 结构的使用

标签: c++ member-function-pointers


【解决方案1】:

指向成员函数的指针总是很难正确。但你快到了。首先,将调用更改为

(obj->*obj->t.fptr)();

然后再想想你是否真的需要使用指向嵌套在你所指向的同一个类的结构中的成员的普通指针,或者某些类型别名或其他方法是否可以美化上面的怪物:)

【讨论】:

  • 只是想指出这里的调用顺序是obj-&gt;*(obj-&gt;t.fptr)而不是(obj-&gt;*obj)-&gt;t.fptr,以防其他人像我一样感到困惑。 :)
  • obj-&gt;*&amp;A::display等价于obj-&gt;*obj-&gt;t.fptr
  • 是的,但我认为 OP 的想法是使用中间 struct test 来进一步间接指向成员的指针。
  • 非常感谢@SilvanoCerza。它工作得很好。让我困惑的一件事是,为什么我们需要两次使用 obj 来调用指向成员函数的指针?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
相关资源
最近更新 更多