我还在学习c ++并且正在关注我的书中的一个例子。我基本上复制了他们的代码并添加了include和namespace。我做错了什么?
代码:
#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';
}
尝试使用g ++ -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 :(得分:0)
您声明了 Date::Date
构造函数,但从未定义它。
您的声明是对编译器的承诺,即构造函数Date::Date
将在某处定义。但你从未真正提供过定义。这就是造成错误的原因。
您可以在类定义中提供定义,就像您使用其他成员函数一样。或者您可以在课堂外提供定义。它是由你决定。但必须在某处提供定义。
答案 1 :(得分: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) { }
答案 2 :(得分:0)
您需要在某处实现Date::Date(int, int, int)
(即Date
构造函数),如编译器明确指出的那样。
您可以通过向其添加正文来实现此目的,例如为其month
,day
和year
方法,或在类外部。
答案 3 :(得分:0)
您必须添加构造函数的实现(定义)
Date(int y, int m, int d);
目前在您的Date
课程中只发出声明,导致此类情况
未定义引用`Date :: Date(int,int,int)&#39; collect2:错误:ld 返回1退出状态