2014-02-16 4 views
1

Есть ли какой-либо возможный способ перегрузить оператор * таким образом, что его назначение и функции наблюдения определяются отдельно?C++ об операторе * перегрузка

class my_class 
{ 
    private: 
    int value; 
    public: 
    int& operator*(){return value;} 
}; 

int main() 
{ 
    my_class obj; 
    int val = 56; 

    *obj = val; // assign 
    val = *obj; // observe, same operator* is called 
} 
+0

Сделать это возвращает прокси-сервер (например, 'вектор :: iterator'). –

+2

Определенный вами оператор - это не тот, который вы вызываете. Тот, который вы определили, является двоичным. Он принимает два аргумента: объект «my_class» слева и «int» справа. Тот, который вы пытаетесь использовать в 'main', унарный. Справа он принимает только один аргумент. –

+0

@BenjaminLindley oh .. спасибо, что указал! – Ivars

ответ

1

Сортировка - вы можете иметь оператор * вернуть экземпляр другого класса, а не возвращать ссылку напрямую. Затем экземпляр другого класса определяет как оператор преобразования, так и оператор присваивания.

(В примере кода, он выглядит, как вы перегружен оператор умножения, когда вы имели в виду перегружать разыменования оператора, я буду использовать разыменования оператора ниже.)

Например:

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 не существует (т. Е. Никогда не объявлять переменную с этим классом), он может работать очень хорошо.

0

Написать свой класс, как так

class my_class 
{ 
    private: 
    int value; 
    public: 
    int operator*() const { // observing 
     return value; 
    } 
    int& operator*() { // assigning 
     return value; 
    } 
}; 

Тогда эти операторы dissambiguated по константность, поэтому код, как это возможно

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    my_class a; 
    *a = 1; // assigning 
    int k = *(const_cast<my_class const&>(a)); // observing 
    return 0; 
} 
+0

наблюдает возможное без const casting? – Ivars

+0

Компилятор выбирает, является ли указатель 'this' const или нет. Он предпочтет версию non const. Таким образом, это возможно только тогда, когда ваш объект уже const (например, аргумент функции const) –

Смежные вопросы