Проблема оператора C ++ - PullRequest
       9

Проблема оператора C ++

9 голосов
/ 28 сентября 2011

Я не знаю, есть ли ответ на этот вопрос уже в stackoverflow. Но я просто не могу найти правильное ключевое слово для поиска.

Ниже я вставил урезанную версию моего кода.

Итак, в основном, что я пытаюсь сделать в main (), это вычесть 122 из t2. Я полагаю, мой компилятор автоматически преобразует целое число в объект Timestamp, а затем вычитает его, как показано в Timestamp.cpp.

Но когда он достигает t4, он не конвертирует его и выдает мне следующую ошибку:

нет совпадения для 'operator-' в '722 - t1'

Я на 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 ]

14 голосов
/ 28 сентября 2011

Вопреки тому, что предлагают другие ответы, вам не нужно предоставлять специализированные operator-, которые принимают int и Timestamp, скорее вы можете (и, вероятно, должны) сделать operator- неучастникомfunction:

Timestamp operator-( Timestamp lhs, Timestamp const & rhs ); // Returns a timestamp?? really??

Таким образом, компилятор может применять преобразования как к левому, так и к правому операндам, а также использовать неявное преобразование из int в Timestamp.

Вы можете прочитать краткое описание по проектированию и реализации перегрузок операторов здесь , или вы можете найти в теге [C ++ - faq] в SO «перегрузку операторов».

3 голосов
/ 28 сентября 2011

Вам необходимо определить следующую функцию, не являющуюся членом:

Timestamp operator-(int left, const Timestamp &right)
{
    //define
}

Кстати, сделайте член operator-() const function следующим образом:

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 предоставил лучшее решение.Но я держу это решение только для академических целей.

0 голосов
/ 28 сентября 2011

Ваш Timestamp::operator-(int) позволяет вычесть целое число из объекта Timestamp. Он не позволяет вычитать метки времени из целых чисел.

Вам нужно добавить оператор - как бесплатную функцию

Timestamp operator-(int, const Timestamp&);

Это должен быть друг Timestamp, так как ему нужен доступ к личным членам.

0 голосов
/ 28 сентября 2011

Я вижу две вещи:

Во-первых, ваш конструктор принимает параметр типа int.Ваш оператор возвращает тип TimeStamp, который вы затем передаете в конструктор.Вы не указали преобразование TimeStamp в int, поэтому это не сработает!

Во-вторых, ваш оператор принимает параметр типа timestamp, но вы, кажется, вычитаете из него int, когда вына самом деле, используя его.Он понятия не имеет, что такое int, потому что вы этого не сказали!

...