Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 纯虚类中的头文件包含_C++ - Fatal编程技术网

C++ 纯虚类中的头文件包含

C++ 纯虚类中的头文件包含,c++,C++,如果我有一个纯虚拟类,如下所示: class interface_class { virtual void someFunction(MyClassA& a) = 0; virtual void someFunction(MyClassB& b) = 0; } 我的班级结构如下: class interface_class { virtual void someFunction(MyClassA& a) = 0; virtual void

如果我有一个纯虚拟类,如下所示:

class interface_class {
    virtual void someFunction(MyClassA& a) = 0;
    virtual void someFunction(MyClassB& b) = 0;
}
我的班级结构如下:

class interface_class {
    virtual void someFunction(MyClassA& a) = 0;
    virtual void someFunction(MyClassB& b) = 0;
}

包含MyClassA/MyClassB的正确方式是什么?我应该在接口类的头文件中做一些转发声明,并在实现的头文件中真正包含,还是应该直接在接口类中包含MyClassA/B的头文件?

对这两个类都使用转发声明。
事实上,只要有可能,请始终使用转发声明。

使用前向声明可以节省编译时间,并限制您创建不必要的依赖项。

对这两个类都使用前向声明。
事实上,只要有可能,请始终使用转发声明。

使用前向声明可以节省编译时间,还可以限制您创建不必要的依赖项。

您应该在单独的头文件中使用前向声明

也就是说,您的当前头文件定义为
MyClassA
MyClassB
。您需要对同时使用的类进行分组,并创建一个新的头文件,如下所示:

文件
MyClassesFwd.h
(命名约定由您决定)

您的界面标题:

#include <MyClassesFwd.h>
// ... your interface definition ...
#包括
// ... 您的接口定义。。。
另一方面,实际的源文件将如下所示:

#include <MyClassA.h>
#include <MyClassB.h>
#include <MyInterface.h>
#包括
#包括
#包括

这将阻止您每次重写转发声明。

您应该在单独的头文件中使用转发声明

也就是说,您的当前头文件定义为
MyClassA
MyClassB
。您需要对同时使用的类进行分组,并创建一个新的头文件,如下所示:

文件
MyClassesFwd.h
(命名约定由您决定)

您的界面标题:

#include <MyClassesFwd.h>
// ... your interface definition ...
#包括
// ... 您的接口定义。。。
另一方面,实际的源文件将如下所示:

#include <MyClassA.h>
#include <MyClassB.h>
#include <MyInterface.h>
#包括
#包括
#包括

这将阻止您每次重写转发声明。

请注意,为了使用转发声明,您必须将参数更改为指针或引用。@BjörnPollex:不太可能。您可以声明接受或返回不完整类型的函数。如果我在那么我必须在cpp文件中包含头,不是吗?这是只在cpp文件中包含头文件的常见方法吗?@JamesBrown147:您需要在cpp文件中包含头文件,因为您的cpp文件需要访问正向声明类的内部(成员),并且编译器无法知道类的定义,除非您包含头文件,如果你不这样做,它会抱怨一个错误。是的,这是正确的方法。好的,因为我一直认为所有包含的内容都应该放在头文件中,而cpp文件只包含它的头文件。请注意,为了使用前向声明,您必须将参数更改为指针或引用。@BjörnPollex:不太可能。您可以声明接受或返回不完整类型的函数。如果我这样做在实现的头文件中有一个转发声明,那么我必须在cpp文件中包含头文件,不是吗?这是只在cpp文件中包含头文件的常见方法吗?@JamesBrown147:您需要在cpp文件中包含头文件,因为您的cpp文件需要访问正向声明类的内部(成员),并且编译器无法知道类的定义,除非您包含头文件,因此,如果您不这样做,它会抱怨一个错误。是的,这是正确的方法。好的,因为我一直认为所有包含的内容都应该放在头文件中,而cpp文件只包含其头文件。在旁注中,您希望通过常量引用传递“a”和“b”(即
f(const MyClassA&a)
)一旦您的类变得庞大和/或难以复制。从那里使用前向声明会更容易。thx,我忘记了引用的&号。在一个附带说明中,您希望在类变大和/或复制复杂时,通过常量引用传递“a”和“b”(即
f(const MyClassA&a)
)。从那里使用前向声明会更容易。thx,我忘记了&用于引用。