C ++运算符问题

时间:2011-09-28 15:33:26

标签: c++ operator-keyword

我不知道这个问题是否已在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;
}

4 个答案:

答案 0 :(得分:14)

与其他答案提出的建议相反,您不需要提供一个专门的operator-intTimestamp,而是您可以(也可能应该){ {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为参数的构造函数。这个构造函数的行为类似于从intTimeStamp的隐式转换函数,这意味着,您不需要定义两个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的朋友,因为它需要访问私有成员。