簡體   English   中英

帶指針和構造函數的typedef結構

[英]typedef struct with pointer and constructor

我正在編寫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;

一:在結構名稱(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年。不再需要遵循Microsoft神秘的做法。

改為這樣做:

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獲取指針值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM