假设我有一个cpp简单文件
//blah.cpp
int blah()
{
return 1;
}
并且有两组文件,其中一组继承另一组。
A.H:
//a.h
#ifndef A_H
#define A_H
class Blah
{
public:
Blah(int var);
int callingblah();
private:
int myvar;
};
#endif
a.cpp包括a.h
//a.cpp
#include "blah.cpp"
#include "a.h"
Blah::Blah(int var) : myvar(var) {}
int Blah::callingblah()
{
blah();
return 2;
}
b.h继承a.h:
#ifndef B_H
#define B_H
#include "a.h"
class ChildBlah : public Blah
{
public:
ChildBlah(int var, int childvar);
int callingblah();
private:
int childvar;
};
#endif
b.cpp包括b.h并且还有主要方法
//b.cpp
#include "blah.cpp"
#include "b.h"
ChildBlah::ChildBlah(int var, int childvar) : Blah(var), mychildvar(childvar) {}
int ChildBlah::callingblah()
{
blah();
return 3;
};
int main()
{
Blah myBlah(1);
ChildBlah myChild(1,2);
cout << myBlah.callingblah();
cout << myChild.callingblah();
}
我编译:
g++ a.cpp b.cpp blah.cpp
这里的问题是我得到“多重定义”错误,因为我已将blah.cpp包含在多个地方。
但我不能不包括blah.cpp,因为那时我会得到“未声明”错误。
为了教育和经验,我故意没有做出什么。必须有一些场景,你只想包含cpp而没有标题。
如何在不为blah.cpp创建头文件的情况下解决此问题?
答案 0 :(得分:3)
您不将CPP文件包含在其他CPP文件中。相反,你为它制作一个标题,并改为包含它。在你的情况下,标题将非常短:
blah.h:
int blah();
现在将"blah.cpp"
替换为"blah.h"
,并按照您的方式编译代码以使其生效。
答案 1 :(得分:0)
如果您在blah.cpp
中加入a.h
,那么您也将其加入b.h
。
由于b.h
会继承a.h
,因此它会继承所有a.h
个包含的文件。
a.h <--- //here you include blah.h(never .cpp)
/ \
/ \
a.cpp b.h
\
b.cpp
因此blah.h
中的方法现在可以在a file
和b file
中使用它。
在main
中,您可以添加a.h
,这就足够了。