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

Posted

技术标签:

【中文标题】两个类(C++)中的类到类转换 - 前向声明?【英文标题】:Class to Class Conversion in two classes (C++) - Forward Declaration? 【发布时间】:2013-12-08 04:11:42 【问题描述】:

我正在自学 C++ 并学习班级到班级的转换。我知道在尝试进行类到类的转换时,您必须使用 operator 关键字。在这种特殊情况下,我有 2 个类:LtimeTime。我正在尝试使用operator 创建一个方法,以便能够将每个类相互转换。

我的问题是因为我试图使用operator 关键字从一个类转换,第一个类声明将引用一个尚未定义的类。如果我要切换一等舱和二等舱,同样的问题会持续存在,因为它们都是相互依赖的。

我的教科书说要解决这个问题,你对第二类使用前向声明。我这样做了,但这并不能解决我的问题。然后我尝试将这些类拆分为单独的文件,并在每个文件和主文件中使用包含语句,但这不起作用。如果这是解决方案,有人可以解释一下这个解决方案的结构吗?

有人能解释一下我如何让这段代码工作吗?为清楚起见,以下是问题和我的代码。提前谢谢你。

编写一个具有 Time 类和 Ltime 类的 C++ 程序。 Time 类应具有名为小时、分钟和秒的整数数据成员,而 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;

【问题讨论】:

这一切都在同一个文件中吗?还是将其组织成.h.cpp 文件? remyabel 下面的解决方案解决了我的问题。如果我将此文件拆分为 3 个文件:main.cpp、Ltime.h 和 Time.h——有人知道包含在每个文件中的工作原理吗? 【参考方案1】:

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

// ...snip...

void Ltime::show()

    cout << secondsFromMidnight;


Time::operator Ltime()

    return Ltime(3600*hours + 60*minutes + seconds);

Live Example

【讨论】:

啊,那行得通。非常感谢。如果我想将文件分成 3 个文件,请说:main.cppLtime.hTime.h--你知道包含在每个文件中是如何工作的吗? 如果您将它们分成 3 个文件,就像您将拥有 Ltime.cppTime.cpp 一样,在这种情况下,您可以在两个 .h 文件中使用前向声明,然后在.cpp 文件中完整的#includes,所以实际上问题不大^^

以上是关于两个类(C++)中的类到类转换 - 前向声明?的主要内容,如果未能解决你的问题,请参考以下文章

类到类访问数据

C++ 类到 C# 类的转换

QObject 基类到继承对象的 C++ 类型转换

C++:如何前向声明出现在基类的静态方法中的派生类?

C++ operator关键字详解

从基类到不同派生类的多重继承转换