Як я можу використовувати cout << myclass


82

myclass це клас C ++, написаний мною, і коли я пишу:

myclass x;
cout << x;

Як вивести 10або 20.2, як значення integerабо floatзначення?

Відповіді:


100

Зазвичай шляхом перевантаження operator<<для вашого класу:

struct myclass { 
    int i;
};

std::ostream &operator<<(std::ostream &os, myclass const &m) { 
    return os << m.i;
}

int main() { 
    myclass x(10);

    std::cout << x;
    return 0;
}

9
Зверніть увагу, що якщо myclassє якісь privateполя, і ви хочете operator<<()їх вивести, myclassслід оголосити std::ostream& operator<<(std::ostream&, myclass const&)як друга.
Justin Time - поновити Моніку

3
Чи не слід це const myclass &mзамість myclass const &m?
Nubcake

3
@Nubcake: Ні. Що стосується компілятора, ці два означають одне і те ж, але я все одно вважаю форму префікса неправильною. Щоб прочитати ++ декларацію C, ви починаєте з того , що був оголошений, і працювати ваш шлях назовні, з constпісля того типу, він говорить: m is a reference to a const myclass. З ним перед типом написано: "m - це посилання на міклас const`, який знаходиться прямо на обшарпаному краю між безглуздим і по-справжньому неграматичним.
Джеррі Коффін,

1
Для тих, хто так бентежить мене, поставте перевантаження оператора поза визначенням вашого класу (як у прикладі).
umnikos

1
@Lorenzo: Ні, це не може бути функцією-членом. Докладніше див. На веб-сайті stackoverflow.com/a/9814453/179910 .
Джеррі Коффін

22

Вам потрібно перевантажити <<оператора,

std::ostream& operator<<(std::ostream& os, const myclass& obj)
{
      os << obj.somevalue;
      return os;
}

Тоді коли ви це зробите cout << x (де у вашому випадку xє тип myclass), воно видасть все, що ви сказали йому в методі. У випадку з наведеним вище прикладом це буде x.somevalueчлен.

Якщо тип члена не може бути доданий безпосередньо до ostream, тоді вам доведеться також перевантажити <<оператор для цього типу, використовуючи той же метод, що і вище.


4
Це оператор лівої зміни, а не "оператор потоку". У контексті Iostreams це або оператор вставки, або вилучення, але це ніколи не є оператором потоку.
Billy ONeal

1
Вибачте, так ви маєте рацію. Саме це я і назвав у своїй голові, оскільки я, як правило, використовую це лише при роботі з потоками. У цьому випадку це буде оператор вставки, як ви кажете, а не просто оператор потоку. Я оновив свою відповідь, щоб видалити цей біт.
Rich Adams

14

це дуже просто, просто впровадьте:

std::ostream & operator<<(std::ostream & os, const myclass & foo)
{
   os << foo.var;
   return os;
}

Вам потрібно повернути посилання на os, щоб ланцюжок виводу (cout << foo << 42 << endl)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.