我有两个A和B类,分别在A.h,A.cpp和B.h,B.cpp中定义。 A类有一个我想在B类函数中使用的结构。因为B类包含在A类中,所以我不能在B类中包含A类,因为它会导致循环依赖。所有文件的代码如下: A.H
#ifndef _A_H
#define _A_H
#include B.h
namespace common {
class A {
public:
static struct strctOfA {
float p1 = 2;
} structA;
void functionOfA();
};
}
#endif // !_A_H
A.cpp
#include A.h
using namespace common;
A::functionOfA() {
B b;
b.functionOfB(structA);
}
B.h
#ifndef _B_H
#define _B_H
namespace common {
class B {
public:
functionOfB(??);
};
}
#endif // !_B_H
B.cpp
#include B.h
using namespace common;
B::functionOfB(??) {
// Want to use structA here;
}
我查看了StackOverflow,发现thread非常接近我的问题,然而,它们要么没有解释答案,要么我无法理解他们的解决方案。请帮帮我。
由于
更新 感谢I-V指出错误并向我提供解释。更新代码对我有用。感谢大家为我的C / C ++编码技能提供额外的知识。 :)
答案 0 :(得分:2)
解决方案很简单,你写的是一个坏习惯。
没有理由在A.h中包含B.h,因为你没有在A.h文件中使用B.h的任何部分。实现它的更好方法是在A.cpp中包含B.h而不在头文件中。
它还将解决你所拥有的周期......
通常,当您不在头文件中使用包含文件的函数/对象时,建议在.cpp文件中包含文件而不在头文件中包含文件:)
此外,您应该使用#pragma一次用于Windows或ifndef用于其他任何事情以确保冲突安全
A.H
#ifndef _A_H
#define _A_H
namespace common {
class A {
public:
static struct strctOfA {
float p1 = 2;
} structA;
}
}
#endif
A.cpp
#include A.h
#include B.h
using namespace common;
class A {
B b;
b.functionOfB(structA);
}
注意:来自B.cpp包括A.h
答案 1 :(得分:0)
这可以通过前向声明来完成,除非你绝对必须通过值传递它。但我想不出这种方法不适用于参考文献。
A.H
#ifndef A_H_
#define A_H_
struct B;
struct A {void f(B&);};
#endif
A.cpp
#include "B.h"
void A::f(B & value) {/* do something */ };
B.h
#ifndef B_H_
#define B_H_
struct A;
struct B {void f(B&);};
#endif
B.cpp
#include "A.h"
void B::f(A & value) {/* do something */ };
如果你需要A中的B值只有一个前向声明,你可以把它放在一个指针中,即使用std :: unique_ptr。