2014-09-03 108 views
-1

我很新的C++和我不断收到未定义的引用错误的构造函数,虽然他们被定义和包括。我知道这是一个非常常见的错误,关于这个问题还有很多问题,但每一个都与我的看法有些不同,我无法解决我的问题。未定义的引用构造函数的虚拟类在C + +

基本上我想要一个类B有一个类A的实例变量,这是一个虚拟类与“真正”的子类ASub。此外,类A的文件在〜/ level1 /中,而类B的文件在〜/ level1/level2 /中。

我不断收到以下错误:

error: undefined reference to 'mynamespace::A::A()' 
error: undefined reference to 'mynamespace::A::~A()' 

啊看起来是这样的:

#ifndef A_H__ 
#define A_H__ 

namespace mynamespace { 

class A { 
public: 
    A(); 
    virtual ~A(); 
}; 

class ASub : public A { 
public: 
    ASub(); 
    ~ASub(); 
}; 

} // namespace mynamespace 

#endif // A_H__ 

a.cc看起来是这样的:

#include "level1/a.h" 

namespace mynamespace { 

A::A() {} 
A::~A() {} 

ASub::ASub() {} 
ASub::~ASub() {} 

}; // namespace mynamespace 

BH看起来是这样的:

#ifndef B_H__ 
#define B_H__ 

#include "level1/a.h" 

namespace mynamespace { 

class B { 
public: 
    B(); 
    ~B(); 
    void SetA(A a); 

private: 
    A a_; 
}; 

} // namespace mynamespace 

#endif // B_H__ 

最后b.cc看起来是这样的:

#include "level1/level2/b.h" 
#include "level1/a.h" 

namespace mynamespace { 

B::B() {} 
B::~B() {} 

void B::SetA(A a) { 
    a_ = a; 
} 

}; // namespace mynamespace 
+2

它不应该编译:处理b.h时,不声明'A'。您显示的代码不是您实际构建的代码。 – 2014-09-03 22:53:36

+0

你如何链接你的对象文件? (我也怀疑''b.h'可以编译,因为'A'的声明丢失了。)另外,'A_H__'是一个保留的标识符,因为它有一个双下划线。不要使用它。 – 2014-09-03 22:55:33

+0

向我们展示您用于构建项目的命令行。 – randomusername 2014-09-03 22:55:57

回答

1

纳入b.h A.H,否则你将无法进行编译。链接器错误可能来自以前的构建,我怀疑你需要做一个干净的构建。