带指针和构造函数的typedef结构

时间:2016-03-15 12:57:34

标签: c++ pointers struct typedef

我正在撰写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);

3 个答案:

答案 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获取指针值。