2013-12-01 12 views
1

в первую очередь, привет всем,C++ конструктор с другим классом-типом данных

Я новичок в этом форуме, так что я надеюсь, что я не сделал какую-либо новобранец ошибки, если это так - пожалуйста исправь меня :). Во-вторых: английский не мой родной язык, поэтому я надеюсь, что смогу сделать мою проблему понятной.

Что касается моей проблемы:

Я должен написать программу на C++ с 2 классами, класс 1 Даты с 3x неподписанных Int на день, месяц и год, и класс 2 Времени с 2м беззнаковым междунар на минуту и ​​час, и 1x Дата.

  • каждый класс имеет конструктор по умолчанию, который вызывает конструктор перегрузки (мы должны работать со списками Инициализатора) Моя проблема в том, что я просто не могу понять, как я могу использовать член класса Date в моем времени класс.

Я знаю, что это не совсем ясно, что моя проблема, так вот упрощенная версия моего кода: главная:

#include "Date.hpp" 
#include "Time.hpp" //(+ iomanip/iostream) 

int main(){ 
Date d1; //Calls Default Constructor of class Date, which initialises with (1,1,2000) 
Time t1(d1,23,30); //should call ovrld-constr. of class Time and keep the date of d1 

в моем «Time.cpp» я пытался чего-л, как:

Time::Time(Date x, unsigned int y, unsigned int z) 
    : d(Date::Date(x)), minute(y), hour(z) //try to call the def constr of class Date 
{ 
return; 
} 

Time::Time() : Time(Date::Date(), 00, 00) //should call the ovrld constr of class Time 
{ 
return; 
} 

, но, конечно, это не работает ... Компилятор всегда говорит:

main.cpp:(.text+0x35c):undefined reference to `Time::Time()' 

, если это помогает, вот выдержка из моего (полностью рабочий) «Date.cpp»:

Date::Date(unsigned int x, unsigned int y, unsigned int z) 
: day(x), month(y), year(z) 
{ 
if(valiDate(day, month, year)==false){ //ValiDate is a function which checks the input       
day=1;month=1;year=2000;} //default date, if Date is not Valid 
return; 
} 

Date::Date() : Date(1,1,2000) 
{ 
return; 
} 

Я надеюсь, что это было достаточно, чтобы сделать мою проблему ясно, если нет, то я всегда могу показать вам полный источник код. Важное примечание: мне не разрешено (!) Редактировать main.cpp. Кроме того, если кто-то может объяснить мою ошибку, а не просто отправить полное решение, было бы очень полезно, потому что я думаю, что решение, которое я в худшем случае, даже не понимаю, не очень помогает мне изучение.

Заранее спасибо за помощь,

С наилучшими пожеланиями.

редактировать:

Я сожалею, я забыл два class.hpp.

1) Рабочий Date.hpp (экстракт)

class Date 
{ 

public: 
    Date(); 
    Date(unsigned int, unsigned int, unsigned int); 


private: 

    unsigned int day, month, year; 
    bool valiDate(unsigned int, unsigned int, unsigned int); 
}; 

2) мой (не работает) Time.hpp.

class Time 
{ 

    public: 

    Time(); 
    Time(Date, unsigned int, unsigned int); 

    private: 

    unsigned int minute, hour; 
    Date d; 

}; 
+1

Добавили ли вы Time.cpp в свой проект? – deepmax

+1

Предоставьте [короткий, самодостаточный, правильный пример] (http://sscce.org) вместо неструктурированного беспорядка фрагментов кода! – Oswald

+0

Покажите нам свой Time.hpp – derpface

ответ

1

я воспроизвел свой проект и нашел десятки компиляции и ошибок, связывающих, но не такая ошибка, как вы не указали. Вот что я нашел:

class Time содержит элемент данных типа Date по значению, поэтому вам нужно указать #include Date.hpp в Time.hpp. Если вы еще этого не сделали, вам нужно добавить include guards в свои заголовки.

Вам не нужно явно указать конструктор Date в элементе инициализаторе времени, так как его называют иначе:

Time::Time(Date x, unsigned int y, unsigned int z) 
    : d(Date::Date(x)), minute(y), hour(z) //try to call the def constr of class Date 
{ 
    return; 
} 

может быть просто:

Time::Time(Date x, unsigned int y, unsigned int z) 
    : d(x), minute(y), hour(z) 
{ 

} 

Обратите внимание, что вы не Не нужно писать return в конструкторах. Также обратите внимание, что : d(x) вызывает конструктор копии даты, а не конструктор по умолчанию. Вы не определили конструктор копирования, и поэтому вы неявно созданы для того, чтобы сделать мелкую копию.

Вы также вызова одного конструктора из другого:

Time::Time() : Time(Date::Date(), 00, 00) 
Date::Date() : Date(1,1,2000) 

Делегирование конструкторами поддерживается в C++ 11, но пока не поддерживается всеми компиляторами, но вы можете просто инициализировать членов себя:

Time::Time() : minute(0),hour(0) 
Date::Date() : day(1),month(1),year(2000) 
+0

yup Я знаю, что конструктор вызовов конструктора - это C++ 11, но мы должны использовать его, когда это возможно;) Другие советы: include Date.hpp в Time.hpp и что мне не нужно специально указывать дату :: Date() были более чем полезны, потому что мне нужно было только ad "{}" до "Time :: Time(): Time (Date :: Date(), 00, 00)", поэтому большое вам спасибо:) Могу ли я как-нибудь «подправить» ваш ответ? – user3054780

Смежные вопросы