我的问题是关于在 g++ 编译器中链接文件。
我有一个.cpp
名为的文件A.cpp
,其中包含一个父类及其子类,每个类都使用 中定义的另一个类的实例B.cpp
,并且在中定义的类中B.cpp
,我们使用 A 中定义的所有类的实例!
我应该如何链接这些文件?这是一种非常糟糕的编程风格吗?我尝试过包含A.cpp
一个B.cpp
和一个B.cpp
,A.cpp
但它是不正确的。
您不必在 B.cpp 中包含 A.cpp,您需要使用头文件。
https://en.wikipedia.org/wiki/Header_file
基本上,头文件包含类和方法的定义。
如果我理解您的示例,您需要一个 Ah 文件,该文件将包含在 B.cpp 中
您应该在头文件中定义一个类。只有函数和静态数据成员定义应该在 .cpp 文件中。您还应该使用编译器宏(#if defined / #define / #endif)来防止多重包含。
关于 B 中的 A 和 A 中的 B:
您所说的会导致无限递归:每个 A 包含一个 B,每个 B 都包含一个 A,每个 B 都包含一个 B,每个 B 都包含一个 A ...等等。
你显然不能那样做。尽管如此,您仍然可以在 A 中拥有一个 A 指针 int B 和一个 B 的实例。
我不知道你想要实现什么,但你可以使用 B 的构造函数来传递指向它所包含的 A 对象的指针(例如,如果总是如此)。
#if !defined(B_CLASS_H)
#define B_CLASS_H
class A; // forward declare A, no include "A.h" here
class B
{
A * a_pointer;
public:
B (A* another_A);
};
#endif
#include "B.h"
B::B (A* another_A) : a_pointer(another_A) { }
#if !defined(A_CLASS_H)
#define A_CLASS_H
#include "B.h"
class A
{
B b_instance;
public:
A (void);
};
#endif
#include "A.h"
A::A (void) : b_instance(this) { }