2013-12-08 106 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',所以它实际上没有什么问题^^ –