Возможно, вы хотите перегрузить оператора < < на объект std::ostream. Я предполагаю, что Вы желаете сделать что-то вроде этого:
Rectangle rect;
std::cout << rect;
Вместо:
Rectangle rect;
std::cout << "Width: " << rect.width << '\n';
std::cout << "Height: " << rect.width;
перегруженных функции (помните, перегрузка операторов перегружает функции, за исключением конкретной подписи) должны иметь следующие подпись:
std::ostream& operator<<(std::ostream&, const Type& type);
Где std::ostream является ostream
объект (например, файл), в данном случае это будет std::cout, а Type - тип, который вы хотите перегрузить, для которого в вашем случае будет Rectangle. Второй параметр является ссылкой на константу, поскольку для печати чего-то обычно не требуется изменять объект, если я не ошибаюсь, второй параметр не должен быть объектом const, но рекомендуется.
Он должен вернуть std::ostream для того, чтобы следующее возможным:
std::cout << "Hello " << " operator<< is returning me " << " cout so I " << " can continue to do this\n";
Это, как вы делаете это в вашем случае:
class Rectangle{
public:
int height;
int width;
};
// the following usually goes in an implementation file (i.e. .cpp file),
// with a prototype in a header file, as any other function
std::ostream& operator<<(std::ostream& output, const Rectangle& rect)
{
return output << "width: " << rect.width <<< "\nheight: " << rect.height;
}
Если у вас есть личные данные в вашем прямоугольнике класса, вы можете захотеть сделать перегруженную функцию функцией друга. Обычно я это делаю, даже если я не получаю доступ к личным данным, просто для удобства чтения, это зависит от вас.
т.е.
class Rectangle{
public:
int height;
int width;
// friend function
friend std::ostream& operator<<(std::ostream& output, const Rectangle& rect);
};
std::ostream& operator<<(std::ostream& output, const Rectangle& rect)
{
return output << "width: " << rect.width <<< " height: " << rect.height;
}
C++ не имеет встроенных средств самоанализа. Можете ли вы рассказать нам немного больше о том, чего вы пытаетесь достичь и почему? –
Вы не можете сделать это так просто. – Pixelchemist
Я думаю, что некоторые из ваших знакомых, должно быть, сказали вам, что вы можете сделать это на Java .. (что правильно ... есть API Reflection в Java), но на C++ такого объекта нет. Вы можете прочитать это предыдущее сообщение http://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-a-c-application, которое является попыткой в этом направлении. – AurA