2013-05-01 250 views
1

我是新的C++,我跑在Visual Studio中下面的代碼C++結構初始化++錯誤

struct bob 
    { 
     double a,b;  
     bob(double a,double b); 
    } 

    int main() 
    { 
     bob z(2.2,5.6); 
     cout<<z.a<<endl; 
     keep_window_open(); 
     return 0; 
    }  

當我運行這段代碼,我得到以下錯誤:

錯誤1個錯誤LNK2019:函數_main中引用的未解析外部符號「public:__thiscall bob :: bob(double,double)」(?? 0bob @@ QAE @ NN @ Z)C:\ drives \ Comp-Mech \ programming \ VS \ C++ \項目\ E1 \ E1.obj E1

+0

你只聲明'bob(double a,double b);',你的實現在哪裏? – johnchen902 2013-05-01 12:35:35

+0

功能請求C++ 17:自動構造函數從其聲明寫入爲'bob(double,double)= default;'和簽名與數據成員匹配時生成。 – TemplateRex 2013-05-01 12:36:19

+0

@rhalbersma:爲什麼?爲什麼不完全刪除構造函數並使用聚合初始化? – 2013-05-01 12:40:57

回答

5

你需要實現你的類bob的構造函數:

bob::bob(double a,double b) : a(a), b(b) {} 
+0

我不認爲'a(a)'有效。 – john 2013-05-01 12:36:00

+5

是的,它的確如此...... – piokuc 2013-05-01 12:36:54

+0

雖然有一個冒號丟失。 – 2013-05-01 12:38:36

1

這是因爲您還沒有編寫bob::bob(double, double)的代碼。

struct bob 
{ 
    double a,b;  
    bob(double aa, double bb) a(aa), b(bb) {} 
}; 
3

您已經提供了bob的構造函數的聲明,但是你沒有給一個定義。該定義給出了構造函數的實現,並說明了它應該做什麼。在這種情況下,你可能希望你的構造函數,它的參數分配給對象的成員變量:

bob::bob(double a, double b) 
{ 
    this->a = a; 
    this->b = b; 
} 

我在上面的代碼中使用賦值,因爲你更容易熟悉它。但是,你應該知道成員初始化列表,讓你可以直接初始化成員:

bob::bob(double a, double b) 
    : a(a), b(b) 
{ } 

這說來初始化成員a的說法a並初始化成員b的說法b。它還避免了在分配給成員之前潛在的昂貴的成員默認初始化。

+0

這是一個結構,所以不需要明確的公開 – piokuc 2013-05-01 12:36:33

+0

@piokuc注意到它後立即注意到。 – 2013-05-01 12:37:22

+0

您可能會提到,對於具有默認構造函數的用戶定義類型,成員初始值設定項也會更有效率,因爲它避免了雙重初始化。 – TemplateRex 2013-05-01 12:41:15