2

我正在尝试编译如下内容:

#include "B.h"
class A {
    B * b;
    void oneMethod();
    void otherMethod();
};

A.cpp

#include "A.h"
void A::oneMethod() { b->otherMethod() }
void A::otherMethod() {}

溴化氢

#include "A.h"
class B {
    A * a;
    void oneMethod();
    void otherMethod();
};

B.cpp

#include "B.h"       
void B::oneMethod() { a->otherMethod() }
void B::otherMethod() {}

到目前为止,我在使用前向声明时没有遇到问题,但我现在可以使用它,因为我不能使用仅前向声明的类的属性或方法。

我该如何解决这个问题?

4

4 回答 4

6

在 C++ 中,与 Java 和 C# 不同,您可以在类外部定义成员函数(提供其主体)。

class A;
class B;

class A {
    B * b;
    void oneMethod();
    void otherMethod() {}
};

class B {
    A * a;
    void oneMethod();
    void otherMethod() {}
};

inline void A::oneMethod() { b->otherMethod(); }
inline void B::oneMethod() { a->otherMethod(); }
于 2012-11-15T20:49:10.390 回答
2

只要我正确理解您的问题,您需要做的就是:

class B;// Forward declaration, the header only needs to know that B exists
class A {
    B * b;
    void oneMethod();
    void otherMethod();
};

A.cpp

#include "A.h"
#include "B.h"//Include in the .cpp since it is only compiled once, thus avoiding circular dependency
void A::oneMethod() { b->otherMethod() }
void A::otherMethod() {}

溴化氢

class A;// Forward declaration, the header only needs to know that A exists
class B {
    A * a;
    void oneMethod();
    void otherMethod();
};

B.cpp

#include "B.h" 
#include "A.h"//Include in the .cpp since it is only compiled once, thus avoiding circular dependency      
void B::oneMethod() { a->otherMethod() }
void B::otherMethod() {}
于 2012-11-15T20:58:58.677 回答
1

您必须推迟使用类的成员,直到定义了该类。在您的情况下,这意味着将一些成员函数体移动到文件的底部:

class B;

class A {
    B * b;
    void oneMethod();
    void otherMethod() {}
};

class B {
    A * a;
    void oneMethod() { a->otherMethod() }
    void otherMethod() {}
};

inline void A::oneMethod() { b->otherMethod() }

这是多个文件中的典型解决方案:

class B;
class A {
    B * b;
    void oneMethod();
    void otherMethod();
};

溴化氢

class A;
class B {
    A * a;
    void oneMethod();
    void otherMethod();
};

A.cpp

#include "A.h"
#include "B.h"

void A::oneMethod() { b->otherMethod() }
void A::otherMethod() {}

B.cpp

#include "A.h"
#include "B.h"

void B::oneMethod() { a->otherMethod() }
void B::otherMethod() {}

主文件

#include "A.h"
int main () { A a; a.oneMethod(); }
于 2012-11-15T20:50:06.230 回答
0

将函数的实现推送到 cpp 文件中,然后 cpp 可以包含两个标头。

于 2012-11-15T20:49:18.837 回答