我一直在浏览项目的代码并遇到了声明
class foo;
.
.
.
.
foo* f1;
在不同的地方。该类尚未在包含的任何标题中声明。任何人都可以告诉我这意味着什么。
答案 0 :(得分:3)
我认为你指的是前瞻性声明。它告诉编译器稍后将定义名为foo
的类。在此之前它是一个“不完整类型”,这意味着可以定义指针和类的引用。在完全定义之前,无法创建类的实例。
答案 1 :(得分:3)
这是一份前瞻性声明。它可以用于类,结构和函数,它告诉编译器这是在别处或以后定义的。
对于课程,有(至少)两个用例。
在前向声明之后,编译器不知道大小或类的成员,只知道名称。这对于指向类的指针(以及基本上是指针周围的语法糖的引用)来说已经足够了。但通常指针就足够了,然后你可以避免将整个头文件包含在另一个中。这有助于编译速度,避免在一个标题更改时重新编译所有内容。
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,在pimpl-idiom标记下的SO处也有很好的涵盖。
class node; // forward declarion
class collection {
node *frist; // pointer enabled by forward declaration
}
class node {
collection *owner; // already defined above so works too
}
在这种情况下,前向声明 required 可以很好地完成这项工作。只是说如果你在野外看到它,那就是使用void指针和强制转换的丑陋方式,有时在新手程序员不知道应该怎么做时使用。
答案 2 :(得分: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();
}