2013-12-08 128 views
0

我正在自學C++並學習班級到班級的轉換。我知道,在嘗試進行班級轉換時,您必須使用operator關鍵字。在這個特殊情況下,我有2個類:LtimeTime。我正在嘗試使用operator來創建一種方法,以便能夠將每個類互相轉換。Class to Class Conversion in two classes(C++) - Forward Declaration?

我的問題是,因爲我試圖使用operator關鍵字從類轉換,第一個類聲明將引用尚未定義的類。如果我要改變頭等艙和二等艙,同樣的問題將會持續存在,因爲它們都相互依賴。

我的教科書說爲了解決這個問題,你使用第二類的前向聲明。我這樣做,但這並不能解決我的問題。然後我嘗試將每個類拆分爲單獨的文件,並在每個文件和主文件中使用include語句,但是這並不起作用。如果這是解決方案,請問有人可以解釋這個解決方案的結構嗎?

有人可以請解釋我如何能得到這段代碼的工作?爲了清楚起見,下面是問題和我的代碼。先謝謝你。

編寫一個具有Time類和Ltime類的C++程序。 Time類應該有名爲hours,minutes和seconds的整型數據成員,而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

我之前就遇到了這個問題。在向前聲明該類時您是正確的,但是您嘗試使用不完整的類型。解決方法是在Ltime的定義後移動Time::operator 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'文件中使用前向聲明,然後在'.cpp'文件中包含'#include',所以它實際上沒有什麼問題^^ –