我正在撰写struct _Point3d
并将其定义为Point3d
,并在PPoint3d
旁边提供了指针声明Point3d
(请参阅代码)。有一个构造函数初始化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;
一:
在struct name(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);
答案 0 :(得分:3)
我正在编写一个struct _Point3d并将其定义为Point3d并在Point3d旁边提供一个指针声明* PPoint3d
停在那儿,Kiddo。这是2016年,而不是1997年。无需再遵循奥术微软实践。
请改为:
app.UseMvc( route => ... )
原始指针将用于低级实现。当用作界面的一部分时,它们会使您的代码容易受到用户意外和未注意到的错误的悄悄劫持。
因此,当用作界面的一部分时,它们是邪恶的。如此邪恶,甚至暗示你的班级用户应该使用它们是邪恶的。
答案 1 :(得分:3)
首先,您使用的是C ++,因此您不需要typedef
结构。你可以写这个。
struct Point3d {
//...
};
typedef惯用法是C中的标准,但不是C ++中的标准(因为你使用new
,你显然是在C ++中,而不是在C ++中。
其次,没有区别,因为typedef确实是一个类型别名。
答案 2 :(得分:1)
存在差异,但实际上正在发生同样的事情。
在
set
您正在获取新Point3d的地址并将其存储在名为_ppoint2的L值(左侧)中。你正在做同样的事情
Point3d* _ppoint2 = new Point3d(....);
唯一的区别是你如何写L值。
_ppoint2是一种结构类型,但是您使用星号对其进行注释以使其成为指针类型。使用_ppoint1,您可以“烘焙”指向结构的指针。
在功能上它们除了类型外是相同的。这种类型的差异意味着您使用它们的方式会有所不同,因为这种方式必须是类型感知的。例如,不需要包含星号来从_ppoint1获取指针值。