【问题标题】:What is forward declaration in c++? [duplicate]什么是 C++ 中的前向声明? [复制]
【发布时间】:2011-02-07 20:20:44
【问题描述】:

This answer 说:

……最后,

typedef struct { ... } Foo;

声明一个匿名结构并为其创建一个typedef。因此,使用此构造,它在标记命名空间中没有名称,只有 typedef 命名空间中的名称。这意味着它也不能被前向声明。如果要进行前向声明,则必须在标签命名空间中为其命名。

什么是前向声明?

【问题讨论】:

  • 你不能转发声明一个匿名结构。
  • @FredN 我真的不确定你指的是什么。 (链接到 question“this answer” 链接没有帮助,因此我们不知道是哪个答案。)在 C++ 中,您可以转发 -声明一个类,但不是 typedef 名称。一个类的“前向声明”就是一个类声明。
  • @sbi:虽然您认为 OP 含糊不清(而且是该网站的新手,所以不知道如何正确链接到特定答案),但该问题只有两个答案也就是说您不能转发声明 typedef,并且查看其中任何一个答案的人(我在上面的一个答案中包含了更完整的引用)将拥有真正回答这个问题所需的上下文。
  • 请注意这个问题被标记为 C++ 但引用是指 C

标签: c++ forward-declaration


【解决方案1】:

乍得给出了一个很好的字典定义。在 C++ 中经常使用前向声明来处理循环关系。例如:

class B; // Forward declaration

class A
{
    B* b;
};

class B
{
    A* a;
};

【讨论】:

  • 值得注意的是,B 只能声明为指针或引用类型,因为它是所谓的不完整类型
【解决方案2】:

“在计算机编程中,前向声明是程序员尚未给出完整定义的标识符(表示类型、变量或函数等实体)的声明。”

-Wikipedia

【讨论】:

  • 我阅读了链接的帖子。我认为这回答了这个问题(在标题和帖子中)“什么是前向声明?”匿名结构对这个问题没有实际意义,尽管 OP 说 typedef 不能被前向声明是不正确的。
  • 重言式不是答案:xkcd.com/703
【解决方案3】:

据我所知,在 C++ 中,the term "forward declaration" is a misnomer. 这只是一个声明,名字很花哨。

【讨论】:

  • 感谢您澄清这不是一种特殊类型的声明。从人们讨论的方式很容易认为是!
  • 另一方面,为什么人们认为有必要为一个不那么特别的概念创建一个特殊的术语?
  • @allyourcode:TTBOMK Stroustrup 在我在链接到的答案中引用的标准措辞制定之前几十年就引入了这个名字。我只能假设该名称是根据该声明的用途选择的,而没有人考虑更大的图景。请记住,C++ 是根据具体需求演变的,而使用它的人则是顺其自然。 (是的,一切都是根据不添加功能来支持单个用例的原则添加的。我的意思是,它并非完全诞生于单一的创造行为。)
【解决方案4】:

前向声明在实际定义之前声明标识符(将其放在命名空间中)。如果需要在定义结构之前使用指向结构的指针,则需要前向声明结构。

在您链接的答案的上下文中,如果您有typedef struct {...} Foo;,则不能在结构内或 typedef 语句结束之前使用指向 Foo 的指针。

另一方面,您可以typedef struct tagFoo Foo; 和以后的struct tagFoo {...};

【讨论】:

  • 不需要新名称:typedef struct Foo Foo;结构 Foo {};
  • 好答案,但请注意,您也可以将类和结构的前向声明用作函数参数和返回值。
【解决方案5】:

当一个类成员在其中使用另一个类的引用时,需要前向声明。例如:

class AB; // forward declaration
class A {
public:
    int j; 
    void sum(AB a) {
        return a.i + j;
    }
};
class AB{
public:
    int i;
};

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2022-11-16
    • 2013-12-08
    • 1970-01-01
    相关资源
    最近更新 更多