我一直在浏览一个项目的代码,遇到了语句
class foo;
.
.
.
.
foo* f1;
在各个地方。该类也未在包含的任何标头中声明。谁能告诉我这是什么意思。
这是一个前向声明。它可以用于类、结构和函数,它告诉编译器这是在别处或以后定义的。
对于类,有(至少)两个用例。
前向声明后,编译器不知道类的大小或成员,只知道名称。这对于指向类的指针(以及基本上是指针周围的语法糖的引用)来说已经足够了。但是通常指针就足够了,然后您可以避免将整个头文件包含在另一个中。这有助于提高编译速度,避免在一个标头更改时重新编译所有内容。
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 的pimpl-idiom标签下也有很好的介绍。
class node; // forward declarion
class collection {
node *frist; // pointer enabled by forward declaration
}
class node {
collection *owner; // already defined above so works too
}
在这种情况下,需要前向声明才能很好地完成这项工作。只是说以防万一你在野外看到它,有使用 void 指针和强制转换的丑陋方式,有时在新手程序员不知道应该如何完成时使用。
我认为您指的是前向声明。它告诉编译器foo
稍后将定义一个名为的类。在那之前,它是一个“不完整类型”,这意味着可以定义对类的指针和引用。在完全定义之前,不能创建类的实例。
你的声明不正确?我不确定..我知道你不能有“任何”空格“名字”..也许你错过了一个下划线?
我相信你的意思是:
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();
}