Chciałbym kontrolować, co jest zapisywane w strumieniu, tj. cout
Dla obiektu klasy niestandardowej. Czy to możliwe w C ++? W Javie można by nadpisać toString()
metodę w podobnym celu.
151
W C ++ możesz przeciążać operator<<
dla ostream
i swoją klasę niestandardową:
class A {
public:
int i;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.i << ")";
}
W ten sposób możesz wyświetlać instancje swojej klasy w strumieniach:
A x = ...;
std::cout << x << std::endl;
Jeśli operator<<
chcesz wydrukować wewnętrzne elementy klasy A
i naprawdę potrzebujesz dostępu do jej prywatnych i chronionych członków, możesz również zadeklarować to jako funkcję znajomego:
class A {
private:
friend std::ostream& operator<<(std::ostream&, const A&);
int j;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.j << ")";
}
friend
, a także wewnątrz ciała klasy - dzięki temu nie będziesz musiał robićusing namespace
dla przestrzeni nazw zawierającej operator (i klasę), ale ADL znajdzie go tak długo, jak obiekt tej klasy jest jeden z operandów.dump
metoda publiczna jest brudna i niepotrzebna. Używaniefriend
tutaj jest całkowicie w porządku. To, czy wolisz metodę zbędną, czy natrętną,friend
jest całkowicie kwestią gustu, chociażfriend
prawdopodobnie została wprowadzona właśnie w tym celu.operator<<()
funkcji składowej nie zadziała: musiałbyś uczynić ją funkcją składowąstd::ostream
, aby akceptowała operand typu po lewej stroniestd::ostream
.Możesz to również zrobić w ten sposób, pozwalając na polimorfizm:
źródło
toString
zachowanie Javy .W C ++ 11 to_string jest ostatecznie dodawane do standardu.
http://en.cppreference.com/w/cpp/string/basic_string/to_string
źródło
ToString()
jest funkcją wirtualną zdefiniowaną w klasie bazowej wszystkich obiektów i dlatego jest używana jako standardowy sposób wyrażania reprezentacji ciągu dowolnego obiektu. Te funkcjestd::string
mają zastosowanie tylko do typów wbudowanych. Idiomatycznym sposobem w C ++ jest przesłonięcie<<
operatora dla typów niestandardowych.operator<<
, w porównaniu do prostejString
semantyki Javy, skłania mnie do uwagi, żeto_string()
jest to nie tylko „przydatny dodatek”, ale nowy preferowany sposób robienia tego w C ++. Jeśli, tak jak w przypadku OP,A
pożądana jest niestandardowa reprezentacja klasy w postaci łańcucha , wystarczy napisaćstring to_string(A a)
poniższą definicjęclass A
wystarczającą. To propaguje się z dziedziczeniem, jak w Javie i może być łączone (przez dodawanie ciągów), jak w Javie. Brak zastępowaniatoString()
w Javie i tak ma ograniczone zastosowanie.Jako rozszerzenie tego, co powiedział John, jeśli chcesz wyodrębnić reprezentację ciągu i zapisać ją w pliku
std::string
zrób to:std::stringstream
znajduje się w<sstream>
nagłówku.źródło
Odpowiedź na pytanie. Ale chciałem dodać konkretny przykład.
Ten przykład wymaga zrozumienia przeciążenia operatora.
źródło