【问题标题】:Correct way of creating structures in c++在 C++ 中创建结构的正确方法
【发布时间】:2014-10-25 07:04:58
【问题描述】:

在学习 C++ 时,书籍总是创建如下结构:

struct X{
    int a;
};

X y; 
X *yp; // pointer to object of X class

但我在网上看到一些 C++ 代码,人们使用以下语法:

struct X y;
struct X *yp;

他们为什么要在前面加上struct,这两种创建X类对象的方法有什么区别。

【问题讨论】:

标签: c++ struct


【解决方案1】:

在 C++(相对于 C)中,当 X 是结构类型时,您通常可以只写 X。你还需要写struct X

  • 用于在极少数情况下消除歧义,并且
  • X 尚未声明时。

最后一点的例子:

  • friend 声明中,
  • 作为模板的 id 类型,
  • 使用通常的 PIMPL 习语

第一点示例:

struct A {};
void A() {}

auto main() -> int
{
    void (*f)() = &A;
    //A x;  // !nyet
    struct A x;
}

【讨论】:

  • 抱歉 PIMPL 成语要点。不知道我在想什么。
【解决方案2】:

这是来自 C 的遗产。在 C 中,以下代码:

struct Foo
{
    int a;
};

创建了一个结构,并将其标签Foo”放在自己的“标签命名空间”中
访问它的唯一方法是:

struct Foo foo;

或者,更常见的:

typedef struct Foo Foo;
Foo foo;

但是,在 C++ 中,标签不仅被放置在单独的标签命名空间中,而且
在封闭的命名空间中。但是为了向后兼容,它仍然允许您
使用struct Name访问它

在 C 和 C++ 中还有一个构造 struct Name 的使用
这是一个前向声明:

struct Later;

Later在这里是一个不完整的类型,你只能将它用于不完整的东西
需要知道它的大小(比如创建一个指针)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2022-01-13
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多