c++结构和类型定义
C++ struct and typdef
我不确定标题,因为我不知道它到底是关于什么的。
我试图理解下面链接中的代码。
基于颜色的粒子过滤器
我大致理解这个程序是做什么的,但是我不明白"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_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
指向的自由函数
State_
是一个结构类型
State
是一个指向函数的指针,接受StateData&
类型的形参,返回State_
。
typedef a b;
定义了与a
完全相同的类型b
。
p
是State_
类的字段,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指定指针到函数的类型,使得编写以其他函数作为输入的函数更具可读性。
- 使用QJsEngine在Qt中注册自定义类型
- 在UE4中使用未定义类型'UTextBlock'
- 修改"std::set"中用户定义类型的值
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 如何使自定义类型在unordered_map中用作键
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- 为什么转换函数声明不需要至少一个定义类型说明符
- 标准::原子中的自定义类型
- 如何使用自定义类型声明Arduino数组?
- 如何在 Cython 中定义返回 cpp 定义类型的函数?
- 使用自定义访问者时具有自定义类型的提升变体失败(源自 boost::static_visitor)
- 您可以将binary_search应用于具有自定义类型的矢量吗?
- 在自定义类型图中重用 SWIG 映射
- 扩展自定义类型的spdlog
- vim使用户定义类型的COLOR与C++中的基本类型相同
- 重载自定义类型的 std::to_string 和 std::to_chars?
- 具有未声明/未定义类型的 typedef 结构
- 函数重载:内置类型与用户定义类型