0

我一直在浏览一个项目的代码,遇到了语句

 class foo;
.
.
.
.
 foo* f1;

在各个地方。该类也未在包含的任何标头中声明。谁能告诉我这是什么意思。

4

3 回答 3

4

这是一个前向声明。它可以用于类、结构和函数,它告诉编译器这是在别处或以后定义的。

对于类,有(至少)两个用例。

1. 不需要完整定义

前向声明后,编译器不知道类的大小或成员,只知道名称。这对于指向类的指针(以及基本上是指针周围的语法糖的引用)来说已经足够了。但是通常指针就足够了,然后您可以避免将整个头文件包含在另一个中。这有助于提高编译速度,避免在一个标头更改时重新编译所有内容。

myfuncs.h

class MyClass; // forward declaration
void helpMyClass(MyClass &needy);

// here this would give compiler error about incomplete type:
//void badHelp(MyClass needy); // value needs definition

myfuncs.cpp:

#include "myclass.h" // entire MyClass definition
void helpMyClass(MyClass &needy) {
  needy.helpMe(false); // needs full definition
}

重要的用例是所谓的PIMPL idiom,在 SO 的标签下也有很好的介绍。

2.两个类需要互相引用

class node; // forward declarion

class collection {
    node *frist; // pointer enabled by forward declaration
}

class node {
    collection *owner; // already defined above so works too
}

在这种情况下,需要前向声明才能很好地完成这项工作。只是说以防万一你在野外看到它,有使用 void 指针和强制转换的丑陋方式,有时在新手程序员不知道应该如何完成时使用。

于 2013-10-25T05:18:40.483 回答
3

我认为您指的是前向声明。它告诉编译器foo稍后将定义一个名为的类。在那之前,它是一个“不完整类型”,这意味着可以定义对类的指针和引用。在完全定义之前,不能创建类的实例。

于 2013-10-25T05:00:45.233 回答
0

你的声明不正确?我不确定..我知道你不能有“任何”空格“名字”..也许你错过了一个下划线?

我相信你的意思是:

class foo any_name();

在这种情况下,它正向声明一个名为 any_name 的函数,该函数返回 foo 的类实例。

例子:

#include <iostream>

class foo any_name();  //The forward declaration..

class foo   //the foo class implementation.
{
    public:
        foo(){std::cout<<"hey";}
};

class foo any_name() //The implementation of the function..
{
    std::cout<<"any_name";
    //return {};   //Can be used to return a constructed instance of foo.
};

 int main()
 {
     any_name();
 }
于 2013-10-25T05:05:12.323 回答