我不确定这个标题,因为我不知道它到底是关于什么的。
我试图理解下面链接中的代码。
我大体上明白这个程序是做什么的,但我想不通“state.h”。这段代码有什么作用?特别是“typedef”、“State_”和“pp”部分对我来说看起来很陌生。
为了清楚起见,我将在此处放置一些代码。
struct StateData;
struct State_;
typedef State_ (*State)(StateData&);
struct State_
{
State_( State pp ) : p( pp ) { }
operator State()
{
return p;
}
State p;
};
State_ state_start(StateData& d);
State_ state_selecting(StateData& d);
State_ state_initializing(StateData& d);
State_ state_tracking(StateData& d);
如有任何帮助,我们将不胜感激。
最佳答案
简而言之:State
是函数指针的别名。State_
是一个包装类,它有一个 State
成员,并且可以隐式转换为那个状态
。
之所以需要 State_
包装器,是因为无法表达返回指向相同类型函数的指针的函数。包装器摆脱了自引用。
逐行:
struct StateData;
StateData
类的前向声明。
struct State_;
State_
类的前向声明。
typedef State_ (*State)(StateData&);
这个有点棘手。它将 State
定义为函数指针的类型别名,该函数指针可以指向返回 State_
并将 StateData&
作为参数的函数。在代码段末尾声明的函数可以由这种类型的函数指针指向。
在我看来,考虑到已经有一个 State_
类,选择的名称非常令人困惑。虽然我通常反对匈牙利表示法,但我建议始终应用后缀或前缀来表示函数指针,例如 state_fun
或 state_handler
或 state_callback
,
struct State_
{
这开始了 State_
类的定义。
State_( State pp ) : p( pp ) { }
这为类定义了一个构造函数。参数是先前定义的函数指针类型。它初始化即将声明的成员。
operator State()
{
return p;
}
成员函数。更具体地说,用户定义到函数指针类型的转换。
State p;
声明在构造函数中初始化的成员。
};
State_ state_start(StateData& d);
State_ state_selecting(StateData& d);
State_ state_initializing(StateData& d);
State_ state_tracking(StateData& d);
可以通过 State
指向的自由函数。
关于C++ 结构和类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40328757/