Может ли экземпляр объекта возвращать свое собственное значение в c ++? - PullRequest
0 голосов
/ 03 марта 2019

Итак, я определяю вариант int как вращающийся целочисленный класс, который очень прост, но я хочу иметь возможность делать что-то вроде

cout << x << '\n';

вместо:

cout << x.value() << '\n';

Это вообще возможно?

Разве нет ничего похожего на

    class rotating_int
{
private:
    int _value, _low, _high;
public:
    int operator++(int) { if (++_value > _high) _value = _low; return _value; }
    int operator--(int) { if (--_value < _low) _value = _high; return _value; }
    int operator++() { if (++_value > _high) _value = _low; return _value; }
    int operator--() { if (--_value < _low) _value = _high; return _value; }

    void operator=(int value) { _value = value;  }

    int operator==(int value) { return _value == value; }

    int val() { return _value; }
    rotating_int(int value, int low, int high) { _value = value; _low = low; _high = high; }

     int ^rotating_array() { return &_value; }

};

Где "^ вращающийся массив" очень похож на определение деструктора ~ вращающийся массив.

Кажется, что это основа объектно-ориентированного проектированиячто это должно быть.

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Для этого в C ++ есть что-то чрезвычайно полезное, но для того, чтобы действительно это понять, требуются некоторые усилия.Как указывает Borgleader: вы хотите перегрузить оператор <<. </p>

В вашем классе вращающихся целых чисел вы должны сообщить компилятору, что оператор << (это то, как вызывается функция, которую вызывает компилятор, когда видитоператор << для любого объекта) может получить доступ к закрытым членам класса.Это сделано, делая функцию другом функцией вращающегося целочисленного класса.В добавляемом классе: </p>

friend std::ostream& operator<<(std::ostream&, const RotatingInteger&)

Реализация функции operator << может выглядеть так: </p>

std::ostream& operator<<(std::ostream& os, const RotatingInteger& i) {
    os << i.value;
    return os; // you need to return the stream in order to add something
               // else after you pass the RotatigInteger-object like in your 
               // example: cout << x << "\n";
}
0 голосов
/ 03 марта 2019

Вы должны использовать оператор перегрузки .

Внутри вашего класса:

friend ostream& operator<<(ostream& os, const RotatingInt& x)
{
    os << x.value;
    return os;
}

Заменить RotatingInt на имя вашего класса.

Вот пример: http://cpp.sh/9turd

...