【问题标题】:Pointers to member functions - can't understand g++ error message指向成员函数的指针 - 无法理解 g++ 错误消息
【发布时间】:2026-02-06 06:45:01
【问题描述】:

我正在编写一个报告系统,包括一个类 - Datum - 包含各种数据点和一个类 - Statistic - 包含有关报告行的元数据。元数据包括指向 Datum 成员函数的指针,以获取和设置数据。

class Statistic
{
    .
    .
    .
        double (Datum::*getter) () const;
        void (Datum::*setter) (const double);
    .
    .
    .
}

我已经为 Statistic 写了一个构造函数:

Statistic::Statistic (
        double Datum::*a_getter (),
        void (Datum::*a_setter)(const double))
{
    getter  = a_getter;
    setter  = a_setter;
}

这不能编译; g++ 输出错误

不能在赋值中将 'double Datum::* ( * )()' 转换为 'double (Datum::*)() const'

[注意:第二个星号和括号之间没有空格,但是如果我将它们省略,格式化后星号不会显示]

在分配给 m_ge​​tter 的行。

我不擅长解释指向函数的指针,而且我无法弄清楚我实际编写的内容。 我似乎已将 m_ge​​tter 声明为指向不带参数并返回双精度的 Datum 成员函数的指针。我不确定const 最终指的是什么。这大约是我想要的 - 我想成为一个指向 const Datum 成员函数的 const 指针,它不带参数并返回一个双精度值。 (我很欣赏这意味着我需要在构造函数中初始化它而不是分配给它。) 我无法弄清楚我最终所说的 getter 是什么,g++ 发出的 *s 超出了我的处理能力。

我应该如何声明 m_ge​​tter 和我的构造函数?

【问题讨论】:

  • double Datum::*getter () 不是 double (Datum::*getter) (),
  • 您有名为“getter”和“setter”的成员变量,它们的名称在构造函数中被隐藏,然后分配给“m_getter”和“m_setter”。请贴出真实代码。
  • 如果我是你,我会为你的函数指针使用 typedef。这样,您就不会混淆指向函数的指针和指向成员的指针。
  • @xryl669。每当我查找有关指向成员函数的指针的信息时,我都会看到使用 typedefs 的建议。我很欣赏它们在编写后会使它更易于使用,但我认为,至少对我而言,额外的层一开始就会使编写代码变得更加困难。

标签: c++ function-pointers


【解决方案1】:

double Datum::*getter ()getter 声明为不带参数的函数,并返回指向Datum 成员的指针,该指针指向double - double Datum::*

使用与您的成员声明中相同的语法; double (Datum::*getter) ().

甚至更好:使用类型别名。

class Statistc
{
    using getter_function = double (Datum::*)() const;
    using setter_function = void (Datum::*)(double);

    getter_function m_getter;
    setter_function m_setter;

    // ...
};
Statistic::Statistic (
        getter_function getter,
        setter_function setter)
    : m_getter(getter),
      m_setter(setter)
{
}

【讨论】:

  • 谢谢你。我不确定如果没有这个,我是否会很容易理解@KamilCuk 的回答。
【解决方案2】:

从顶部开始,有多余的空格:

double * somepointer;
         ^^^^^^^^^^^ a pointer to double
double Datum::* otherpointer;
                ^^^^^^^^^^^^ a pointer to double within `Datum`
                             The double that we point to is within Datum
double Datum::*   getter();  
                  ^^^^^^ - a declaration of a function named `getter`
                           that returns a pointer to double within `Datum`
                           and takes no arguments
double (Datum::*   getter2)();
                   ^^^^^^^ - a function pointer to member function
                             can point to a function within `Datum`
                             can be called using an instance of `Datum`
                             that returns double and takes no arguments
double (Datum::*   getter3)() const;
                   ^^^^^^^ - a function pointer to member function
                             can point to a function within `Datum`
                             can be called using an instance of `const Datum`
                             that returns double and takes no arguments

你可以:

class Statistic
{
    double (Datum::*m_getter) () const;
    void (Datum::*m_setter) (const double);

    Statistic::Statistic (
            double (Datum::*getter)() const,
            void (Datum::*setter)(const double))
    {
        m_getter  = getter;
        m_setter  = setter;
    }
};

【讨论】:

  • 非常感谢;我认为这是一个完整的答案,因为它告诉我如何解释各种形式的变量和函数定义,以及如何实现我的目标。