我有一个关于在C ++代码中多次包含头文件的问题。
例如,我说有三个X,Y,Z类。 X和Y派生自Base类Z.我想在Y中创建一个X实例。代码将是这样的。class Z{some code}
class X:public Z{some code};//here #include header of class Z added
class Y:public Z //here #include header of class Z added as well as of X class
{private:
X* mX;//instance of X
some code};
所以在这个基类的所有方法的多重定义中出现了。我该如何应对这个问题
答案 0 :(得分:8)
使用“包含警卫”(Wikipedia link)
#ifndef MYHEADER_H
#define MYHEADER_H
// header file contents go here...
#endif // MYHEADER_H
这是惯用的代码,任何经验丰富的C和C ++程序员都可以轻松识别。将MYHEADER_H
更改为特定于您的内容,例如,如果标头定义了名为CustomerAccount
的类,则可以调用警卫CUSTOMERACCOUNT_H
。
在您的特定情况下,为每个类都有一个单独的头/源文件。 Z类的头文件将包含一个include guard:
#ifndef Z_H
#define Z_H
// Code of Z class
#endif Z_H
现在,X和Y的标题可以安全地包含z.h
- 它只会被包含在.cpp
文件中,包含x.h
和y.h
并且不会发生重复。
始终记住,在C和C ++中,实际编译的是源(.c或.cpp)文件,而不是头文件。头文件只是由预处理器“复制粘贴”到include
个源文件中。
答案 1 :(得分:3)
您还可以在头文件中使用 #pragma once 预处理程序指令。 (无需担心#ifndef #define #endif)
答案 2 :(得分:1)
你使用所谓的包括守卫或头部守卫。他们是这样的:
// within some_header.h
#ifndef SOME_HEADER_H
#define SOME_HEADER_H
// stuff goes here
#endif
基本上,第一次围绕宏尚未定义,因此包含了内部的所有内容。但是,在第一次后续包含后将无效。
与所有命名方案一样,命名方案完全是任意的,由您决定。我喜欢以这种方式将文件名包含在内,就像我上面所做的那样。我还在我的实际项目中包含名称空间和项目名称。
有几件事需要注意。你可能想做这样的事情:
#define _SOME_HEADER_H__
稍微混淆一下。但是,以下划线后跟大写字母或包含双下划线的名称是保留标识符,您无法使用它们。
答案 3 :(得分:-1)
这里是避免项目中包含多个标题的简单方法。
//MYCLASS.h
#ifndef _MYCLASS_H_
#define _MYCLASS_H_
class CMyClass
{
public:
CMyClass();
}
#endif //_MYCLASS_H_