带有指针和构造函数的 typedef 结构
typedef struct with pointer and constructor
我正在编写一个struct _Point3d
并将其键入以Point3d
,并在Point3d
旁边PPoint3d
提供了一个指针声明(请参阅代码)。有一个构造函数可以初始化struct
的成员。我这里有两个问题。
typedef struct _Point3d
{
float x;
float y;
float z;
_Point3d(float _x, float _y, float _z) : x(_x), y(_y), z(_z)
{
}
}Point3d, *PPoint3d;
一:这种在结构名称 (typedef) 后提供指针的约定到底意味着什么?前提是我们可以像这样创建Point3d
指针
Point3d* _ppoint2 = new Point3d(1.0, 0.0, 0.0);
二:以这两种不同的方式创建Point3d
实例有什么区别吗?
PPoint3d _ppoint1 = new Point3d(0.0, 1.0, 0.0);
Point3d* _ppoint2 = new Point3d(1.0, 0.0, 0.0);
我正在编写一个结构_Point3d并将其键入到 Point3d 并在 Point3d 旁边提供了一个指针声明 *PPoint3d
停在那里,基多。这是2016年,而不是1997年。无需再遵循神秘的微软实践。
请改为执行以下操作:
struct Point3d
{
float x;
float y;
float z;
Point3d(float _x, float _y, float _z) : x(_x), y(_y), z(_z)
{
}
};
using PPoint3d = std::unique_ptr<Point3d>;
using SharedPoint3d = std::shared_ptr<Point3d>;
原始指针将用于低级实现。当用作接口的一部分时,它们使您的代码容易受到用户意外和未被注意的错误悄无声息地劫持。
因此,当它们用作接口的一部分时,它们是邪恶的。如此邪恶,以至于甚至暗示您的类用户应该使用它们是邪恶的。
首先,您处于C++,因此您无需typedef
结构。你可以写这个。
struct Point3d {
//...
};
typedef 习语在 C 中是规范,但在 C++ 中不是(既然你使用 new
,你显然是在 C++ 中,而不是在 C 中)。
其次,没有区别,因为 typedef 确实是一个类型别名。
有差异,但实际上同样的事情正在发生。
在
Point3d* _ppoint2 = new Point3d(....);
您正在获取新 Point3d 的地址并将其存储在名为 _ppoint2 的 L 值(左侧)中。 你正在做同样的事情
PPoint3d _ppoint1 = new Point3d(....);
唯一的区别是你如何写入 L 值。
_ppoint2 是结构类型,但您使用星号对其进行批注以使其成为指针类型。 有了_ppoint1,您已经"烘焙"了指向结构的指针。
在功能上,除了类型外,它们是相同的。 这种类型差异意味着使用它们的方式会有所不同,因为这种方式必须是类型感知的。 例如,不需要包含星号即可从_ppoint1获取指针值。
- 如何创建 typedef 结构的前向声明
- 无法转发声明C typedef结构-正在查找其他建议
- 如何使用 SWIG 接口访问 python 中的 C++ typedef'd 结构
- 具有未声明/未定义类型的 typedef 结构
- 在 CPP 中初始化 typedef 结构变量
- C++ 无法在 typedef 结构中重载<运算符
- 在 typedef 结构中声明一个数组
- 从 csv 文件中获取不同类型的数据,并将其放入 C++ 中的 typedef 结构中
- 为什么 typedef 结构允许默认初始值设定项?
- 为什么我不能像正常一样初始化 typedef 结构字符串或字符?
- 在Typedef结构中,下划线意味着什么
- 来自 typedef 结构的错误
- 在Typedef结构(C )中超载运算符
- C++中具有对象名称的typedef结构的正向声明
- 为什么Typedef结构会产生链路故障
- 在Typedef结构中定义结构
- 类中typedef结构的奇怪行为
- C/C++ 中的套接字编程 - 接收由 typedef 结构定义的消息
- 扩展typedef结构(与VC++11兼容)
- 为什么子类在C++中看不到父类的 typedef 结构?