不重复!我有两节课。一个是:
// header A.h
#ifndef __A__
#define __A__
class B; // forward declaration
class A {
public:
A() { }
~A() { }
void LinkB(B* b = 0);
Int_t Func1();
Int_t Func2() {return 1;};
protected:
B* mB;
};
#endif
// source A.cxx
#include "A.h"
#include "B.h"
#include <iostream>
void A::LinkB(B* b) {
this->mB = b;
mB->LinkA(this);
cout << mB->Func4();
}
Int_t A::Func1() {
return 1;
}
和几乎相同的伙伴:
// header B.h
#ifndef __B__
#define __B__
class A; // forward declaration
class B {
public:
B() { }
~B() { }
void LinkA(A* a = 0);
Int_t Func3();
Int_t Func4() {return 1;};
protected:
A* mA;
};
#endif
// source B.cxx
#include "B.h"
#include "A.h"
#include <iostream>
void B::LinkA(A* a) {
this->mA = a;
cout << mA->Func2();
}
Int_t B::Func3() {
return 1;
}
在宏中,我先编译B,然后编译A,然后使用在标题中声明和实现的Func2和Func4方法,一切正常。 但是,如果我切换到在源代码中实现的Func1和Func2 ,则我会收到编译错误,编译B。
I-TUnixSystem::ACLiC: creating shared library /home/./B.so
dlopen error: /home/./B_cxx.so: undefined symbol: _ZN9A14AFunc1Ev
Load Error: Failed to load Dynamic link library /home/./B_cxx.so
如果我切换顺序,即先编译B.cxx,然后编译A.cxx,则会得到类似的东西:未定义符号:_ZN9B10BLinkAEP9A
对于它的价值,我正在编译CERN ROOT框架以编译类。
任何想法我在做什么错/如何解决?非常感谢! 一种方法是在标头中将函数实现为内联(然后可以正常工作),但是我的函数非常冗长,将它们作为内联感觉不对。
编辑:
正如评论中所讨论的,这不是重复的,因为从一般c ++的角度来看代码是好的,并且可以用“常规” c ++编译器和链接器进行编译和链接,并且被root 6接受。根5的运行时库生成。