C ++ struct和typdef

时间:2016-10-30 11:54:46

标签: c++

我不确定标题,因为我不知道它的真正含义。

我试图理解下面链接中的代码。

Color Based Particle Filter

我通常了解程序的功能,但我无法理解" 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);

非常感谢任何形式的帮助。

4 个答案:

答案 0 :(得分:5)

简明扼要:State是函数指针的别名。State_是一个包含State成员的包装类,可以隐式转换为State

需要State_包装器的原因是因为无法表达返回指向同一类型函数的指针的函数。包装器摆脱了自我引用。

逐行:

struct StateData;

StateData的前向声明。

struct State_;

State_的前向声明。

typedef State_ (*State)(StateData&);

这个有点棘手。它将State定义为函数指针的类型别名,该函数指针可以指向返回State_并将StateData&作为参数的函数。在代码片段末尾声明的函数可以由此类型的函数指针指向。

在我看来,考虑到已经有State_类,所选名称非常混乱。虽然我通常会反对匈牙利表示法,但我建议始终使用后缀或前缀来表示函数指针,例如state_funstate_handlerstate_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;定义的类型ba完全相同。

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指定指向函数的指针类型,使得编写函数可以将其他函数作为输入,具有很强的可读性。