声明类foo是什么;意思

时间:2013-10-25 04:57:21

标签: c++ class

我一直在浏览项目的代码并遇到了声明

 class foo;
.
.
.
.
 foo* f1;
在不同的地方。该类尚未在包含的任何标题中声明。任何人都可以告诉我这意味着什么。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

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
}

在这种情况下,前向声明 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();
 }