2014-09-03 62 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,否則你將無法進行編譯。鏈接器錯誤可能來自以前的構建,我懷疑你需要做一個乾淨的構建。

相關問題