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,我忘记了&用于引用。