2013-03-25 4 views
1

Вот код ideone: http://ideone.com/Qp8EqgПерегрузки оператор присваивания для типа удержания

Мой вопрос, можно ли заставить преобразование на основе только Lvalue? Например,

[Seconds] s = 2_h + 60_s; 
cout <<s.getSeconds()<<endl; 

Очевидно, я должен был бы написать что-то вроде 2_h.toSeconds(), но это было бы слишком многословным и не достигает идеи.

+0

Вы имеете в виду 'Seconds s = 2_h + 60_s;'? Или даже более вероятно: 'Seconds s = 2_h;'? –

+0

'2_h.toSeconds()' недействителен. Вы можете написать '2_h .toSeconds()', чтобы сделать его действительным. Кроме того, do '(2_h) .toSeconds()' –

ответ

3

Чтобы разрешить это (что, скорее всего, ваш вопрос, чем то, что вы написали, поправьте меня, если я ошибаюсь):

Seconds s = 2_h; 

следующее будет работать: Добавить operator Seconds() const в класс Hours:

class Hours { 
    unsigned long long _hours; 
public: 
    Hours(unsigned long long hours) : _hours(hours) { } 

    operator Seconds() const; 

    unsigned long long getHours() const { 
     return this->_hours; 
    } 
}; 

и определить его после класса Seconds:

Hours::operator Seconds() const { return this->_hours * 3600; } 
1

Как уже отмечалось в приведенном ответе, необходимо ввести operator Seconds() для автоматического преобразования с Hours в Seconds. С помощью этого оператора вы также можете упростить operator+. И чтобы улучшить время выполнения, вы можете также добавить значение constexpr для оценки значений во время компиляции.

#include <iostream> 

class Seconds { 
    public: 
     constexpr Seconds(const Seconds& other) : seconds_(other.seconds_) {} 
     constexpr Seconds(unsigned long long seconds) : seconds_(seconds) {} 

     Seconds& operator=(const Seconds& other) { 
      seconds_ = other.seconds_; 
      return *this; 
     } 

     constexpr unsigned long long value() const { 
      return this->seconds_; 
     } 

    private: 
     unsigned long long seconds_; 
}; 


class Hours { 
    public: 
     constexpr Hours(const Hours& other) : hours_(other.hours_) {} 
     constexpr Hours(unsigned long long hours) : hours_(hours) {} 

     Hours& operator=(const Hours& other) { 
      hours_ = other.hours_; 
      return *this; 
     } 

     unsigned long long value() const { 
      return this->hours_; 
     } 

     operator Seconds() const { return Seconds(hours_*60*60); } 
    private: 
     unsigned long long hours_; 
}; 


constexpr Seconds operator+(const Seconds& lhs, const Seconds& rhs) 
{ 
    return Seconds(lhs.value()+rhs.value()); 
} 

constexpr Hours operator "" _h(unsigned long long hours) { 
    return Hours(hours); 
} 

constexpr Seconds operator "" _s(unsigned long long seconds) { 
    return Seconds(seconds); 
} 


int main() { 
    using namespace std; 

    Seconds s = 1_h + 10_s; 
    cout <<s.value()<<endl; 
    s = 2_h + 60_s; 
    cout <<s.value()<<endl; 
    return 0; 
} 
+0

Спасибо, но вы сделали одну маленькую опечатку. Это должно быть lhs.value() + rhs.value(). – 2013-03-25 20:28:16