指向成员函数的指针--无法理解g++的错误信息。

问题描述 投票:0回答:2

我正在编写一个报表系统,包括一个包含各种数据点的类--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_getter的那一行,我很不擅长解释函数的指针,我不知道我到底写了什么。

我不擅长解释函数的指针,我不知道我到底写了什么。我似乎声明m_getter是一个指向Datum成员函数的指针,不接受任何参数,并返回一个double。我不知道这个 const 最终被引用。这大约是我想要的--我想成为一个const Datum成员函数的const指针,不接受任何参数,并返回一个double(我知道这意味着我需要在构造函数中初始化它,而不是赋值)。(我知道这意味着我需要在构造函数中初始化它,而不是赋值给它。)我无法理解我最后说的是什么。getter 是,g++发出更多的 *我不知道该怎么做,但我想知道的是,我应该如何声明m_getter和我的构造函数?

我应该如何声明m_getter和我的构造函数?

c++ function-pointers
2个回答
2
投票

double Datum::*getter () 声明 getter 的函数,不接受任何参数,并返回一个指向成员的指针。Datum 指向 double - a 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)
{
}

1
投票

从顶部开始,加上额外的空格。

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;
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.