我不确定标题,因为我不知道它的真正含义.
我一般都了解程序的功能,但我无法弄清楚“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是函数pointer的别名.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_calss的定义.
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);
免费功能,可由国家指出.