2016-03-15 70 views
1

我正在写一个struct _Point3d和typedefed它到Point3d并提供了一个指针声明PPoint3d旁边Point3d(请参阅代码)。有一个构造函数初始化struct的成员。我在这里有两个疑问。typedef结构与指针和构造函数

typedef struct _Point3d 
{ 
    float x; 
    float y; 
    float z; 

    _Point3d(float _x, float _y, float _z) : x(_x), y(_y), z(_z) 
    { 

    } 

}Point3d, *PPoint3d; 

一: 是什么结构名称后提供指针(类型定义)本公约的真正含义?只要我们能创造的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

'Point3d'是一个'struct _Point3d','PPoint3d'是一个'struct _Point3d *'或换句话说指向'struct _Point3d'的指针或一个指向'Point3d'的指针。第二个问题,不,这是一回事。 –

+1

1)这里指针的typedefing在我看来是不喜欢语言句法的曲柄的工作。 2)没有区别。 3)保留以下划线开头的全局名称空间中的名称。 – StoryTeller

+5

为什么在使用'new'时标记为C?如果这只适用于C++,那么声明不遵循C++约定来声明和使用类。 – NathanOliver

回答

3

我写一个结构_Point3d并通过typedef到三维点,并提供了指针声明* PPoint3d旁边的Point3D

停在那儿,老兄。这是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>; 

生指针在低层次的实现使用。当作为界面的一部分使用时,他们会让你的代码容易被用户的意外和不被注意的错误悄悄地劫持。

因为这个原因,它们在作为界面的一部分使用时是邪恶的。如此邪恶,甚至暗示你的班级的用户应该使用它们是邪恶的。

+5

我们可以下车“生指针是如此邪恶”吗?非拥有的原始指针没有问题。 – StoryTeller

+0

@StoryTeller std :: experimental :: observer_ptr存在的原因正是因为原始指针是邪恶的,特别是当用作观察者时,仅仅是因为用户可以错误地劫持它们。 –

+0

'observer_ptr'不会阻止没有纪律的用户做不好的事情。假设语言特征本身是邪恶的,这只是荒谬的。 – StoryTeller

1

有差异,但实际上发生同样的事情。

Point3d* _ppoint2 = new Point3d(....); 

你正在服用的新的三维点的地址,并将其存储在一个名为_ppoint2 L值(左侧)。你也是这样做的

PPoint3d _ppoint1 = new Point3d(....); 

唯一的区别是你如何写L值。

_ppoint2是一个结构类型,但是用星号标注它以使其成为指针类型。使用_ppoint1,您已经“烘烤”指向结构体的指针。

在功能上它们除了类型以外都是相同的。这种差异意味着你使用它们的方式会有所不同,因为这种方式必须是类型意识的。例如,一个不需要包含星号以从_ppoint1获取指针值。

3

首先,你在C++中,所以你不需要typedef你的结构。你可以写这个。

struct Point3d { 
//... 
}; 

的类型定义成语在C常态,而不是在C++(因为你使用new你清楚是在C++中,不C)。

其次,没有区别,因为typedef确实是一个类型别名。