Ошибка ссылки "ld: fatal: Symbol ссылаются на ошибки."
Я все еще учу С ++ и следую примеру из моей книги. Я в основном скопировал их код и добавил к ним пространство имен. Что я делаю неправильно?
Код:
#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
4 ответа
Date(int y, int m, int d);
Сообщение об ошибке сигнализирует (по общему признанию неясным способом), что нет никакого определения для Date
, Это объявлено, но не определено. Вы не указали, что делает конструктор.
Date(int y, int m, int d) {
this->y = y;
this->m = m;
this->d = d;
}
Или, лучше, используя синтаксис списка инициализатора:
Date(int y, int m, int d): y(y), m(m), d(d) { }
Вы должны добавить реализацию (определение) конструктора
Date(int y, int m, int d);
На данный момент в вашем объявлении найдена только декларация Date
класс и такая ситуация приводит к
неопределенная ссылка на `Date::Date(int, int, int)' collect2: error: ld вернул 1 состояние выхода
Вам необходимо реализовать Date::Date(int, int, int)
(т.е. Date
конструктор) где-то, как явно указано вашим компилятором. Вы можете сделать это, добавив к нему тело, как для его month
, day
а также year
методы, или вне класса.
Вы объявили Date::Date
конструктор, но никогда не определял его.
Ваша декларация - это обещание компилятору, что конструктор Date::Date
будет определен где-то. Но вы никогда не давали определение. Вот что вызывает ошибку.
Вы можете предоставить определение прямо внутри определения класса, как вы делали это с другими функциями-членами. Или вы можете дать определение за пределами класса. Это тебе решать. Но определение должно быть предоставлено где-то.