Сортировка - вы можете иметь оператор * вернуть экземпляр другого класса, а не возвращать ссылку напрямую. Затем экземпляр другого класса определяет как оператор преобразования, так и оператор присваивания.
(В примере кода, он выглядит, как вы перегружен оператор умножения, когда вы имели в виду перегружать разыменования оператора, я буду использовать разыменования оператора ниже.)
Например:
class my_class
{
friend class my_class_ref;
public:
my_class_ref operator*() { return my_class_ref(this); }
private:
int value;
};
class my_class_ref
{
public:
operator int() { return owner->value; } // "observe"
my_class_ref& operator=(int new_value) { owner->value = new_value; return *this; } // "assign"
private:
my_class* owner;
my_class_ref(my_class* owner) { this->owner = owner; }
};
Есть некоторые оговорки. Например, поскольку my_class_ref реализован с указателем на его родительский класс, ваш код должен быть осторожным, чтобы my_class_ref всегда имел жизнь короче, чем время жизни соответствующего my_class, иначе вы будете разыскивать недействительный указатель.
На практике, если вы притворяетесь, что my_class_ref не существует (т. Е. Никогда не объявлять переменную с этим классом), он может работать очень хорошо.
Сделать это возвращает прокси-сервер (например, 'вектор :: iterator'). –
Определенный вами оператор - это не тот, который вы вызываете. Тот, который вы определили, является двоичным. Он принимает два аргумента: объект «my_class» слева и «int» справа. Тот, который вы пытаетесь использовать в 'main', унарный. Справа он принимает только один аргумент. –
@BenjaminLindley oh .. спасибо, что указал! – Ivars