两类中的类到类转换(C ++) - 前向声明?

时间:2013-12-08 04:11:42

标签: c++ class oop forward-declaration

我正在自学C ++并学习课堂转课。我了解在尝试进行类转换时,必须使用operator关键字。在这种特殊情况下,我有两个类:LtimeTime。我正在尝试使用operator创建一个方法,以便能够将每个类相互转换。

我的问题是,因为我试图使用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;
}

1 个答案:

答案 0 :(得分:0)

之前我遇到过这个问题。您在向前声明该类时是正确的,但您尝试使用不完整的类型。解决方案是在Time::operator Ltime()的定义后移动Ltime

// ...snip...

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

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

Live Example