2016-03-01 2 views
1

Я искал это немного и не повезло. Может быть, я искал неправильные слова, или, может быть, это необычный запрос (или просто не выполнимый).Перегрузка экземпляра класса Переменная

Несмотря на это, на мой вопрос: я хочу, чтобы иметь возможность использовать экземпляр класса ... ну, вот очень простой пример:

class attribute 
{ 
    float value; 
    float min; 
    float max; 
} 

attribute attr1; 
attr1.value = 5.0f; 

Сейчас, в основном, я хочу использовать attr1, как если бы Я звоню

attr1.value 

Так что, когда я, скажем,

std::cout << attr1 << std::endl; 

Это напечатает 5.0 (или просто 5).

Спасибо!

+0

Вы сохраняете '' 5.0f' в attr1.value' и интересно, почему вы получите его в качестве возвращаемого значения? Шутки в сторону? –

+0

Nope. Прочитай заново. Я хочу знать, как отображать 5 (или 5.0), просто используя attr1, а не attr1.value. –

+1

Вы должны переопределить оператор << для ostream. Вы найдете все, что вам нужно в Интернете, с этой информацией. – Garf365

ответ

6

Вы должны реализовать

std::ostream& operator<<(std::ostream& os, attribute const& att) 
{ 
    os << att.value; 
    return os; // this is how you "chain" `<<` 
} 

либо разрешения att.value через public, friend корабль, или написать функцию.

Другой альтернативой было бы построить оператор приведения к float:

class attribute 
{ 
    public: 
    operator float() const 
    { 
     return value; 
    } 

    private: 
    /*the rest of your class here*/ 

Но это может ввести неожиданные неясностей.

И, наконец, если вы хотите, чтобы attribute вел себя как числовой тип, вы можете перегрузить больше операторов по своему усмотрению. Например, чтобы перегрузить +=, вы могли бы написать

template<typename Y> 
attribute& operator+=(const Y& p) 
{ 
    value += p; 
    return *this; 
} 
+0

Несомненно. Есть ли способ сделать это таким образом, что он работает повсеместно? Например ... передавая как параметр и рассматривая его как float в этом случае? –

+1

Вы имеете в виду оператора литья для 'float'? (Это может вызвать у вас проблемы). – Bathsheba

+0

Несколько. Подумайте об этом, как attr1 BECOMES attr1.value, насколько это касается остальной части программы. Очевидно, attr1 является экземпляром класса атрибута. Но я хочу, чтобы он притворялся - маскарад, как, если хотите, это переменная «значение» внутри этого класса. Но, конечно, я все еще хочу относиться к нему так, как если бы это была переменная класса ко всему, что не требует, чтобы это было float. –

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