我正在编写一个报表系统,包括一个包含各种数据点的类--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和我的构造函数?
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)
{
}
从顶部开始,加上额外的空格。
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;
}
};