如何在两个链接的不同cpp文件中包含cpp文件?

时间:2017-12-19 03:43:55

标签: c++

假设我有一个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创建头文件的情况下解决此问题?

2 个答案:

答案 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 fileb file中使用它。 在main中,您可以添加a.h,这就足够了。