2014-09-28 93 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