2014-09-28 91 views
-1

我仍然在學習C++,並且正在關注我書中的一個例子。我基本上覆制了他們的代碼並添加了包含和名稱空間。我究竟做錯了什麼?鏈接錯誤「ld:fatal:符號引用錯誤。」

代碼:

#include <iostream> 
#include <string> 
using namespace std; 

class Date{ 
    int y,m,d; 
public: 
    Date(int y, int m, int d); 
    int month(){return m;} 
    int day(){return d;} 
    int year(){return y;} 
}; 

int main(){ 
    Date b{1970,12,30}; 
cout<< b.month()<< '\n'; 
} 

試圖用克來編譯++ -std = C++ 11 -o TEST2 test2.cc

錯誤:

Date::Date(int, int, int)   /var/tmp//ccGuivAs.o 
ld: fatal: Symbol referencing errors. No output written to main  
collect2: ld returned 1 exit status 
+0

您需要在某處提供'Date'構造函數的實現。 – blackbird 2014-09-28 14:47:46

回答

0

聲明Date::Date構造函數,但從來沒有定義爲它。

您的聲明是對編譯器的承諾,即構造函數Date::Date將在某處定義。但是你從來沒有提供過定義。這是導致錯誤的原因。

您可以在類定義中提供定義,就像您對其他成員函數所做的一樣。或者你可以在課堂外提供一個定義。它是由你決定。但是必須在某個地方提供定義。

0
Date(int y, int m, int d); 

該錯誤消息信令(在公認不清楚的方式),其有一個爲Date沒有定義。這是宣佈的,但沒有定義。您沒有指定構造函數的作用是

Date(int y, int m, int d) { 
    this->y = y; 
    this->m = m; 
    this->d = d; 
} 

或者,更好,使用initializer list語法:

Date(int y, int m, int d): y(y), m(m), d(d) { } 
+0

我添加了:y(y),m(m),d(d){}給我的日期(int y,int m,int d):按照建議,我不再收到錯誤(YAY!)。但現在不打印出主要內容。感覺就像我被困在班上一樣。 – Gely 2014-09-28 15:05:17

0

您需要實現Date::Date(int, int, int)(即Date構造)的地方,如明確你的編譯器說。 你可以通過添加一個實體來實現,比如它的month,dayyear方法,或者在類之外。

0

您必須添加構造

Date(int y, int m, int d); 

的實現(定義)目前只有在你Date類發現的聲明這樣的情況導致

undefined reference to `Date::Date(int, int, int)' collect2: error: ld returned 1 exit status

http://ideone.com/wMgbKX