2013-07-30 38 views
2

所有C++錯誤LNK2019:在多頭類

解析外部符號我敢打賭,這是一個經常被問到的問題。但每次都會在不同的背景下提出。這是我的問題:我在VS2012 Express中有一個項目。該項目包含少量頭文件。在這裏粘貼整個項目是沒有意義的,因此我只是給出一個簡短的結構。

在頭文件Header.h,我有其被定義爲一個父類辛如下:

class Sim 
{ 
    protected: 
    // some member data 
    public: 
     Sim(int x, int y, A a); 
     vector<int> return_parameters(A a); // problems happen at this function 
     // class A is defined in another header file and properly included here 
     // function return_parameters has no definition, thus is an abstract function 
} 

Sim::Sim(int x, int y, A a) 
{// some operations} 

然後,我有類Sim_son從辛

class Sim_son: public Sim 
    { 
     private: 
     // some member data 
     public: 
     Sim_son(int x, int y, A a, int z); 
     vector<int> return_parameters(A a); 
    }; 

    Sim_son::Sim_son(int x, int y, A a, int z): Sim(x,y, a) 
    { 
    // some operations 
    } 

    vector<int> Sim_son::return_parameters(A a) 
    { 
    return a.someData; 
    } 

在主(派生,公共),我這樣的代碼:

void main() 
    { 
    // some operations 
    Sim_son Obj_son(x, y, a, z); 
    Obj_son.return_parameters(a) //PROBLEM HAPPENS 
    } 

編譯器提供了一個LNK2019錯誤WH ich說在函數Sim_son :: Sim_son(void)中引用了未解析的外部符號Sim :: return_parameters。

我在行「Obj_son.return_parameters(a)」上寫了一行,然後錯誤消失了。所以我想這是麻煩的根源。

任何人都可以幫我解決這個問題嗎?提前謝謝了。

問候 龍

+0

歡迎來到堆棧溢出!您不需要在帖子中添加簽名 - 您的用戶卡會自動添加。閱讀[幫助](http://stackoverflow.com/help/behavior)瞭解更多詳情。 – Artemix

回答

0

首先,你的主要應該像

int main() { 
    return 0; 
} 

其次,你有沒有下面的語句後;

Obj_son.return_parameters(a) 

另外,你的類 '辛' 需要與;結束。

0

在類Sim的聲明中,您告訴編譯器您有一個名爲return_parameters的函數,但是您沒有給它一個實現,因此不會生成Sim::return_parameters的目標代碼。只要你不調用這個函數是沒有問題的,因爲它的目標代碼是不需要的。但是當你調用它時,鏈接器需要它的對象代碼並且找不到它,所以它會給出一個錯誤。

發生這種情況是因爲您沒有告訴編譯器return_parameters是虛函數。嘗試:

class Sim 
{ 
    protected: 
    // some member data 
    public: 
     Sim(int x, int y, A a); 
     virtual vector<int> return_parameters(A a) = 0; 
} 

這將使return_parameters一個純虛函數,因此不能產生辛的一個實例。

或者如果您不希望Sim成爲抽象類,則可以將return_parameters標記爲虛擬併爲其提供默認實現。像這樣:

class Sim 
{ 
    protected: 
    // some member data 
    public: 
     Sim(int x, int y, A a); 
     virtual vector<int> return_parameters(A a) 
     { 
      return vector<int>(); 
     } 
} 

問題是,沒有提供函數體不會產生虛函數。因此,提供關鍵字virtual :)

在我看來,你需要多一點的虛擬功能培訓。看看這個鏈接:C++ Polymorphism