我不知道这个问题是否已在stackoverflow上得到解答。但我找不到合适的搜索关键字。
我在下面插入了我的代码的一些精简版本。
所以基本上我在main()中尝试做的是从t2中减去122。我想我的编译器会自动将整数转换为Timestamp对象,然后按照'Timestamp.cpp'中的显示减去它。
但是当它到达t4时它没有转换它并给我以下错误:
'722 - t1'中的'operator-'不匹配
我100%确定它是可能的。但是如何?
也许我对转换完全错了......所以请犹豫纠正我,我正在努力学习。
剥离代码:
main.cpp中:
#include <iostream>
#include <iomanip>
#include "Timestamp.h"
using namespace std;
int main() {
Timestamp t3(t2 - 122);
cout << "T3 = " << t3 << endl;
Timestamp t4(722 - t1);
cout << "T4 = " << t4 << endl;
return 0;
}
Timestamp.h
#ifndef TIJDSDUUR_H
#define TIJDSDUUR_H
using namespace std;
class Timestamp {
public:
Timestamp(int);
Timestamp operator- (const Timestamp &t);
private:
int hour;
int min;
};
Timestamp.cpp
Timestamp::Timestamp(int m) : hour(0), min(m) {
}
Timestamp Timestamp::operator- (const Timestamp &t) {
Timestamp temp;
temp.hour = hour;
temp.min = min;
temp.hour -= t.hour;
temp.min -= t.min;
while(temp.min < 0.00) {
temp.hour--;
temp.min += 60;
}
return temp;
}
答案 0 :(得分:14)
与其他答案提出的建议相反,您不需要提供一个专门的operator-
来int
和Timestamp
,而是您可以(也可能应该){ {1}}非成员函数:
operator-
这样编译器可以自由地将转换应用于左侧操作数和右侧操作数,并使用从Timestamp operator-( Timestamp lhs, Timestamp const & rhs ); // Returns a timestamp?? really??
到int
的隐式转换。
您可以阅读有关运算符重载here的设计和实现的简短说明,或者您可以在SO中的[C ++ - faq]标记中搜索“运算符重载”。
答案 1 :(得分:3)
您需要定义以下非成员函数:
Timestamp operator-(int left, const Timestamp &right)
{
//define
}
顺便说一句,将成员operator-()
const函数设为:
Timestamp operator-(const Timestamp &t) const;
//^^^^^ this makes the function const
如果你创建这个const,只有right-left
可以工作,因为right
是const对象,因此只能调用const成员函数。
我注意到你有一个以int
为参数的构造函数。这个构造函数的行为类似于从int
到TimeStamp
的隐式转换函数,这意味着,您不需要定义两个operator-()
函数(一个是您已经定义的成员函数,另一个是作为我上面建议的非会员功能)。相反,您只能定义此类型的一个朋友函数:
Timestamp operator-(const Timestamp &left, const Timestamp &right)
{
//define
}
您需要创建该类的friend
,因为它需要访问该类的private
成员。但是,@ David提供了更好的解决方案。但我保留这个解决方案只是出于学术目的。
答案 2 :(得分:0)
我看到的两件事:
首先,构造函数采用int类型的参数。您的运算符返回类型TimeStamp,然后您将其传递给构造函数。您尚未指定从TimeStamp到int的转换,因此这不起作用!
其次,您的运算符正在使用timestamp类型的参数,但是当您实际使用它时,您似乎从中减去了一个int。它不知道int是什么,因为你没有告诉它!
答案 3 :(得分:0)
您的Timestamp::operator-(int)
允许您从Timestamp对象中减去一个整数。它不允许您从整数中减去时间戳。
您需要添加operator-作为自由函数
Timestamp operator-(int, const Timestamp&);
这需要成为Timestamp的朋友,因为它需要访问私有成员。