两个类(C++)中的类到类转换 - 前向声明?
Posted
技术标签:
【中文标题】两个类(C++)中的类到类转换 - 前向声明?【英文标题】:Class to Class Conversion in two classes (C++) - Forward Declaration? 【发布时间】:2013-12-08 04:11:42 【问题描述】:我正在自学 C++ 并学习班级到班级的转换。我知道在尝试进行类到类的转换时,您必须使用 operator
关键字。在这种特殊情况下,我有 2 个类:Ltime
和 Time
。我正在尝试使用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.cpp
、Ltime.h
和 Time.h
--你知道包含在每个文件中是如何工作的吗?
如果您将它们分成 3 个文件,就像您将拥有 Ltime.cpp
和 Time.cpp
一样,在这种情况下,您可以在两个 .h
文件中使用前向声明,然后在.cpp
文件中完整的#include
s,所以实际上问题不大^^以上是关于两个类(C++)中的类到类转换 - 前向声明?的主要内容,如果未能解决你的问题,请参考以下文章