我有以下两个类:
Foo,它有构造函数Foo(Bar *,int,int)
和Bar调用新的Foo(this,int,int)
我认为前进在Bar.h中声明Foo和/或Foo.h中的Bar会解决问题。
(返回的错误是新Foo上的“未定义引用”)
我正在使用Clang进行编译。
现在的链接顺序(但在两种情况下都发生相同的错误)是Foo然后是Bar。
关于我做错了什么的想法?
代码大致如下。遗憾的是,我无法显示任何真正的代码片段
#include Bar.h
class Bar ;
class Foo {
public:
Foo(Bar* bar, int arg1, int arg2) ;
void method1() {
I access bar->field here
}
然后是Bar的代码
#include Foo.h
class Bar {
public:
Bar() {
Cache* cache = new Cache(this, 0, 0) ;
}
答案 0 :(得分:1)
看起来应该是这样的(不包括警卫):
<强> foo.h中强>
class Bar;
class Foo {
public:
Foo(Bar*, int, int);
};
<强> bar.h 强>
class Bar {
public:
Bar();
};
<强> foo.cc 强>
#include "foo.h"
// Note: no need to include bar.h if we're only storing the pointer
Foo::Foo(Bar*, int, int) { ... }
<强> bar.cc 强>
// Note: the opposite order would also work
#include "bar.h"
#include "foo.h"
Bar::Bar() {
new Foo(this, int, int);
}
如果您从链接器获得“未定义的引用”,则可能使用与您定义的签名不同的签名声明Foo::Foo
,或者根本没有定义它,或者没有链接到目标文件它被编译成。