C++ 语句类foo是什么;意思是

C++ 语句类foo是什么;意思是,c++,class,pimpl-idiom,C++,Class,Pimpl Idiom,我一直在浏览一个项目的代码,遇到了这个语句 class foo; . . . . foo* f1; 在不同的地方。该类也未在包含的任何标头中声明。谁能告诉我这是什么意思。我想你指的是远期申报。它告诉编译器稍后将定义一个名为foo的类。在此之前,它是一个不完整的类型,这意味着可以定义类的指针和引用。在完全定义该类之前,无法创建该类的实例。您的声明不正确吗?我不确定。。我知道你不能有任何空间名。。也许你漏掉了一个下划线 我相信你的意思是: class foo any_name(); 在这种情

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

 class foo;
.
.
.
.
 foo* f1;

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

我想你指的是远期申报。它告诉编译器稍后将定义一个名为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();
 }

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

对于类,至少有两个用例

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
}
这方面的重要用例是所谓的,在这里的so-under-tag中也有详细介绍

2.两个类需要相互引用
在这种情况下,需要向前声明才能很好地工作。我只是想说,如果你在野外看到它,有一种使用void指针和强制转换的丑陋方式,有时在新手程序员不知道该怎么做时使用。

虽然这个名字表明了一个例子,但对我来说这看起来像一个例子。这通常用于声明指向类foo的指针,而不必包含类定义本身。
class node; // forward declarion

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

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