c++结构和类型定义

C++ struct and typdef

本文关键字:定义 类型 结构 c++      更新时间:2023-10-16

我不确定标题,因为我不知道它到底是关于什么的。

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

基于颜色的粒子过滤器

我大致理解这个程序是做什么的,但是我不明白"state.h"是怎么回事。这段代码是做什么的?尤其是"typedef"、"State_"answers"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成员。

之所以需要State_包装器,是因为没有办法表示返回指向同一类型函数的指针的函数。包装器去掉了self-reference。


逐行:

struct StateData;

StateData的前向声明。

struct State_;

State_的前向声明。

typedef State_ (*State)(StateData&);

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

在我看来,考虑到已经有一个State_类,所选择的名称非常令人困惑。虽然我通常反对匈牙利符号,但我建议总是应用后缀或前缀来表示函数指针,例如state_funstate_handlerstate_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指向的自由函数

State_是一个结构类型

State是一个指向函数的指针,接受StateData&类型的形参,返回State_

typedef a b;定义了与a完全相同的类型b

pState_类的字段,pp是构造函数的参数。p(pp)是只用于构造函数的特殊语法,将p初始化为pp

的值。

声明了一个名为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)
这样做的一个好处是你可以很容易地改变number变量的数据类型,特别是当你有大量的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 )
{ 
}

这些原型函数返回State_,接受对StateData的引用

State_ state_start(StateData& d);
State_ state_selecting(StateData& d);
State_ state_initializing(StateData& d);
State_ state_tracking(StateData& d);

typedef有助于定义指向函数的指针。您有一个具有以下标题的函数。State_是返回类型,输入是对StateData的引用。

State_ function (StateData&)

然后只需添加星号(和父级来解析优先级)来描述指向该函数的指针。

State_ (*State) (StateData&)

然后将typedef放在前面,将其定义为新类型。现在你有了一种新的类型,可以在其他地方使用。Typedef用于创建类型别名,使你的代码更具可读性。

typedef State_ (*State) (StateData&)

现在State类型可以在其他地方使用。使用这个新类型声明一个新的变量p

State p

使用new State类型作为构造函数的输入

State_(State pp)

能够使用typedef指定指针到函数的类型,使得编写以其他函数作为输入的函数更具可读性。