2014-01-29 87 views
-4

我遇到了一些需要運行的C++程序的困難。問題本身不是我的,我必須將其編譯。該算法是相當巨大的,所以對於我目前的錯誤信息,我將演示一個更簡化的代碼,我生成的代碼給了我完全相同的錯誤。下面是代碼:純虛函數中的未定義引用C++

class_1.h(class_1.cpp爲空)

class class_1 { 
public: 
class_1(); 
virtual ~class_1(); 
virtual void function() =0; 
}; 

class_2.h(class_2.cpp爲空)

include"class_1.h"; 

class class_2 : public class_1{ 
public: 
class_2(); 
virtual ~class_2(); 
virtual void function(); 
}; 

class_2a.h(class_2a.cpp爲空)

include"class_2.h"; 

class class_2a : public flos2{ 
public: 
class_2a(); 
virtual ~class_2a(); 
}; 

class_3.h

include "class_2a.h" 
include "class_1.h" //I tried unsuccesfully without including class_1.h as well 

class class_3 { 
public: 
class_3(); 
virtual ~class_3(); 
virtual void function(); 
private: 
class_2a my_class_2a; 
}; 

class_3.cpp

#include "class_3.h" 

class_3::class_3() 
:my_class_2a() 
    { 
    } 

class_3::~class_3() 
{ 
this->function(); 
} 

void flos3::function() 
{ 
my_class_2a.function(); 
/***Main Body of function***/ 
} 
}; 

我得到的錯誤是鏈接錯誤:

undefined reference to `class_2::function()' 

我知道一般整個算法似乎是愚蠢的,但或多或​​少這是我得到了什麼,我不允許改變結構本身,只是爲了讓它工作。正如你在class_1中看到的,函數被定義爲一個純虛函數,然後通過其他類被調用。我真的不知道該怎麼做這件事情的工作,所以任何幫助將非常感激......

+3

您不允許更改class_2.cpp以添加函數的實現嗎? –

+0

請編譯一個最小的測試用例(並且仍然有未定義的參考) –

+3

基類或接口的虛函數應該在其派生類中實現。在class_2.cpp中,我沒有看到'virtual void function()'的任何實現' – Itachi

回答

0

您需要添加:

class_1.cpp:

class_1::~class_1() = default; 

class_2.cpp :

class_2::~class_2() = default; 
void class_2::function() { 
    // add code here (or not) 
} 

...等等。

0

您正在收到鏈接錯誤,因爲您的功能class_2::function()沒有實現。您需要添加它,最好在class_2.cpp文件中。

void class_2::function() 
{ 
    // Implementation goes here 
} 

類似的問題是所有的虛擬析構函數。他們也需要實現。