2013-05-27 5 views
1

Скажем, у меня есть класс следующим образомListing члены класса C++

class Rectangle{ 
    public: 
    int height; 
    int width; 

}; 

Как я могу распечатать список членов этого класса, не говоря вручную cout<<a.height или что-то подобное. Другими словами, не зная, что у членов другого класса есть, есть ли способ опубликовать членов, заданных новым классом?

+2

C++ не имеет встроенных средств самоанализа. Можете ли вы рассказать нам немного больше о том, чего вы пытаетесь достичь и почему? –

+2

Вы не можете сделать это так просто. – Pixelchemist

+1

Я думаю, что некоторые из ваших знакомых, должно быть, сказали вам, что вы можете сделать это на Java .. (что правильно ... есть API Reflection в Java), но на C++ такого объекта нет. Вы можете прочитать это предыдущее сообщение http://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-a-c-application, которое является попыткой в ​​этом направлении. – AurA

ответ

7

Возможно, вы хотите перегрузить оператора < < на объект 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; 
} 
+0

Спасибо за это, но это не сработает в случае, когда кто-то еще ставит новый класс и ожидает распечатать список участников без перегрузки << operator – bachkoi32

+1

@ sanke93 Вот почему вы перегружаете оператор << для этого класс.Если оператор << не предоставляется вам через чужой код, и вы хотели бы напечатать таким образом, тогда вам придется предоставить его самостоятельно. В C++ нет общего способа сделать это, даже если бы это было связано с ограничением программиста, поскольку печать различных типов объектов может даже не требовать печати всех их переменных-членов (например, печать вычисленного значения для объекта вместо переменная). Как и в языках ООП, данные обычно всегда скрыты от клиента и доступны через gettes/setters. –

+0

Хорошо, спасибо! Это проясняет многое! – bachkoi32

0

Как уже отмечалось, C++ не предоставляет никаких средств, чтобы сделать это автоматически.

Хорошая практика кодирования на C++ заключается в том, чтобы предоставить объявление класса и его членов, а также как можно комментироваться и документироваться в файле заголовка , который идентичен объявленному классу.