2016-03-15 69 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確實是一個類型別名。