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

typedef struct with pointer and constructor

本文关键字:typedef 结构 构造函数 指针      更新时间:2023-10-16

我正在编写一个struct _Point3d并将其键入以Point3d,并在Point3d旁边PPoint3d提供了一个指针声明(请参阅代码)。有一个构造函数可以初始化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年。无需再遵循神秘的微软实践。

请改为执行以下操作:

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