Как я могу использовать 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&)как друга.
Джастин Тайм - Восстановите Монику
3
Разве это не должно быть const myclass &mвместо myclass const &m?
Nubcake
3
@Nubcake: Нет. Что касается компилятора, они означают одно и то же, но я все равно считаю форму префикса неправильной. Чтобы прочитать ++ декларацию C, вы начинаете с того , что был объявлен, и работать ваш путь наружу, с constпосле того типа, он говорит: m is a reference to a const myclass. С ним перед типом написано: «m - это ссылка на myclass 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(где xis of type myclassв вашем случае), он выведет все, что вы ему сказали в методе. В случае приведенного выше примера это будет x.somevalueчлен.

Если тип члена не может быть добавлен непосредственно к элементу ostream, вам потребуется перегрузить <<оператор для этого типа, используя тот же метод, что и выше.

Рич Адамс
источник
4
Это оператор сдвига влево, а не «оператор потока». В контексте Iostreams это либо оператор вставки, либо извлечения, но никогда не оператор потока.
Билли Онил
1
Простите, да, вы правы. Это то, что я назвал в голове, поскольку я обычно использую его только при работе с потоками. В этом случае это будет оператор вставки, как вы говорите, а не просто оператор потока. Я обновил свой ответ, чтобы удалить этот бит.
Rich Adams
14

это очень просто, просто реализуйте:

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

Вам нужно вернуть ссылку на os, чтобы связать outpout (cout << foo << 42 << endl)

Тристрам Гребенер
источник
-3

Альтернатива:

struct myclass { 
    int i;
    inline operator int() const 
    {
        return i; 
    }
};
Эмиль Мокан
источник