我不确定标题,因为我不知道它的真正含义。
我试图理解下面链接中的代码。
我通常了解程序的功能,但我无法理解" 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);
非常感谢任何形式的帮助。
答案 0 :(得分:5)
简明扼要:State
是函数指针的别名。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);
免费功能,可由State
指出。
答案 1 :(得分:3)
State_
是一种结构类型。
State
是指向函数的指针,接受StateData&
类型的参数并返回State_
。
typedef a b;
定义的类型b
与a
完全相同。
p
是类State_
的字段,pp
是构造函数的参数。 p(pp)
仅是构造函数的特殊语法,将p
初始化为pp
的值
答案 2 :(得分:1)
这个声明一个名为StateData
的结构struct StateData;
typedef关键字用于为类型
创建新别名
例如:
typedef int mynumber; /// mynumber is an alias of type of int
mynumber number = 3; /// so you can do this (number is a type of int just the int name is different)
这样做的一个优点是,如果您有大量的mynumber实例,您可以轻松地更改数字变量的数据类型:
例如:
typedef int mynumber;
mynumber number1 = 3;
mynumber number2 = 4;
mynumber number3 = 5;
// what if you want to make all this type of double? or a float? easy
// just change the int to a double or float like this
typedef float mynumber;
typedef double mynumber;
这个声明了一个名为State _
的结构体struct State_;
这个定义了上面声明的State_。
struct State_
{
State_( State pp ) : p( pp ) { }
operator State()
{
return p;
}
State p;
};
这是初始化p
的列表。它初始化声明的p
结构内部(i,e。State p
);
State_( State pp ) : p( pp )
{
}
这些原型函数返回接受StateData
引用的State_State_ state_start(StateData& d);
State_ state_selecting(StateData& d);
State_ state_initializing(StateData& d);
State_ state_tracking(StateData& d);
答案 3 :(得分:1)
typedef在定义函数指针时有帮助。你有一个具有以下标题的功能。 State_是返回类型,输入是对StateData的引用。
version := "1.0"
scalaVersion := "2.12.0"
// https://mvnrepository.com/artifact/org.scalatest/scalatest_2.11
libraryDependencies += "org.scalatest" % "scalatest_2.11" % "3.0.0"
然后只需添加star(和parens来解析优先级)来描述指向此函数的指针。
State_ function (StateData&)
然后将typedef放在其前面以将其定义为新类型。现在你有了一个可以在其他地方使用的新类型。 typedef用于创建类型别名,使您的代码更具可读性。
State_ (*State) (StateData&)
现在这种类型的状态可以在其他地方使用。使用此新类型
声明新变量typedef State_ (*State) (StateData&)
p
使用新的State类型作为构造函数的输入
State p
能够使用typedef指定指向函数的指针类型,使得编写函数可以将其他函数作为输入,具有很强的可读性。