2013-12-08 5 views
0

Я учу себя C++ и узнаю о преобразованиях класса в класс. Я понимаю, что при попытке преобразования класса в класс вы должны использовать ключевое слово operator. В этом конкретном случае у меня есть 2 класса: Ltime и Time. Я пытаюсь создать метод, используя operator, чтобы иметь возможность конвертировать каждый класс друг в друга.Преобразование класса в класс в двух классах (C++) - форвардная декларация?

Моя проблема в том, что, поскольку я пытаюсь использовать ключевое слово operator для преобразования из класса, объявление первого класса будет ссылаться на класс, который еще не определен. Если бы я должен был переключать первый класс и второй класс, то такая же проблема сохранится, поскольку они оба зависят друг от друга.

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

Может кто-нибудь объяснить, как я могу заставить этот код работать? Для ясности ниже приведена проблема и мой код. Заранее спасибо.

Напишите программу на С ++, которая имеет класс времени и класс ожидания. Класс времени должен иметь целочисленные элементы данных, называемые часами, минутами и секундами, а класс Ltime должен иметь длинный целочисленный элемент данных с именем elsecs, который представляет количество прошедших секунд с полуночи. Для класса Time включите функцию оператора преобразования с именем Ltime(), которая преобразует объект Time в объект Ltime. Для класса Ltime включить оператор преобразования с именем Time(), который преобразует объект Ltime в объект Time.

Мой код:

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

/* 
* Pg 527) §11.3) 
*/ 


class Ltime; 

class Time 
{ 
private: 
    int hours; 
    int minutes; 
    int seconds; 
public: 
    Time(int hr=1, int min=2, int sec=3) : hours(hr), minutes(min), seconds(sec) {} 
    void show(); 
    operator Ltime(); 
}; 

void Time::show() 
{ 
    cout << setfill('0') 
     << setw(2) << hours << " : " 
     << setw(2) << minutes << " : " 
     << setw(2) << seconds; 
} 

Time::operator Ltime() 
{ 
    return Ltime(3600*hours + 60*minutes + seconds); 
} 


class Ltime 
{ 
private: 
    long secondsFromMidnight; 
public: 
    Ltime(long = 0); 
    void show(); 
    operator Time(); 
}; 

Ltime::Ltime(long sec) 
{ 
    secondsFromMidnight = sec; 
} 

void Ltime::show() 
{ 
    cout << secondsFromMidnight; 
} 

Ltime::operator Time() 
{ 
    int hours, minutes, seconds; 
    hours = int(3600/secondsFromMidnight); 
    minutes = (secondsFromMidnight/60)%60; 
    seconds = secondsFromMidnight%60; 

    return Time(hours, minutes, seconds); 
} 




int main() 
{ 
    Time a; 
    a.show(); 
    cout << endl; 

    Time b(1,0,0); 
    b.show(); 
    cout << endl; 

    Ltime c; 
    c = Ltime(b); 
    c.show(); 
    cout << endl; 

    Ltime(b).show(); 
    cout << endl; 

    return 0; 
} 
+0

Является ли это все в одном файле? Или это организовано в файлы '.h' и' .cpp'? – nhgrif

+0

такой же файл на данный момент. – user1527227

+0

Решение remyabel ниже решило мою проблему. Если я разделил этот файл на 3 файла: main.cpp, Ltime.h и Time.h - кто-нибудь знает, как включится работа в каждом файле? – user1527227

ответ

0

Я столкнулся с этой проблемой раньше. Вы были правы в прямом объявлении класса, но пытаетесь использовать неполный тип. Решение заключается в перемещении Time::operator Ltime() после определения Ltime.

// ...snip... 

void Ltime::show() 
{ 
    cout << secondsFromMidnight; 
} 

Time::operator Ltime() 
{ 
    return Ltime(3600*hours + 60*minutes + seconds); 
} 

Live Example

+0

А это сработало. Огромное спасибо. Если бы я хотел разделить файл на 3 файла, скажите: 'main.cpp',' Ltime.h' и 'Time.h' - знаете ли вы, как включенные функции будут работать в каждом файле? – user1527227

+0

Если вы разделите их на 3 файла, то у вас также будут 'Ltime.cpp' и' Time.cpp', и в этом случае вы можете использовать форвардные объявления в обоих файлах .h', а затем полный '# include' в файлах '.cpp', поэтому на самом деле это не проблема. ^ –

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