Je voudrais contrôler ce qui est écrit dans un flux, c'est cout
-à- dire pour un objet d'une classe personnalisée. Est-ce possible en C ++? En Java, vous pouvez remplacer la toString()
méthode à des fins similaires.
151
En C ++, vous pouvez surcharger operator<<
pour ostream
et votre classe personnalisée:
class A {
public:
int i;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.i << ")";
}
De cette façon, vous pouvez générer des instances de votre classe sur des flux:
A x = ...;
std::cout << x << std::endl;
Si vous operator<<
souhaitez imprimer les éléments internes de la classe A
et que vous avez vraiment besoin d'accéder à ses membres privés et protégés, vous pouvez également le déclarer comme une fonction d'ami:
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
, et aussi à l'intérieur du corps de la classe - avec cela, vous n'aurez pas à faireusing namespace
pour l'espace de noms contenant l'opérateur (et la classe), mais ADL le trouvera tant que l'objet de cette classe est l'un des opérandes.dump
méthode publique est sale et inutile. Utiliserfriend
ici est parfaitement bien. Que vous préfériez une méthode redondante ou une méthode intrusivefriend
est entièrement une question de goût, bien qu'ellefriend
ait sans doute été introduite dans ce but précis.operator<<()
une fonction membre ne fonctionnera pas: vous devrez en faire une fonction membre destd::ostream
pour qu'elle accepte un opérande de gauche de typestd::ostream
.Vous pouvez également le faire de cette façon, en permettant le polymorphisme:
la source
toString
comportement de Java .En C ++ 11, to_string est finalement ajouté au standard.
http://en.cppreference.com/w/cpp/string/basic_string/to_string
la source
ToString()
est une fonction virtuelle définie sur la classe de base de tous les objets, et est donc utilisée comme moyen standard pour exprimer une représentation sous forme de chaîne de n'importe quel objet. Ces fonctionsstd::string
ne s'appliquent qu'aux types intégrés. La manière idiomatique en C ++ est de remplacer l'<<
opérateur pour les types personnalisés.operator<<
, par rapport à laString
sémantique simple de Java, m'incite à remarquer que ceto_string()
n'est pas seulement "un ajout utile", mais la nouvelle façon préférée de le faire en C ++. Si, comme par l'OP, une représentation sous forme de chaîne personnalisée d'une classeA
est souhaitée, il suffit d'écrire unestring to_string(A a)
définition ci - dessous declass A
suffices. Cela se propage avec héritage comme en Java, et peut être combiné (par ajout de chaîne) comme en Java. Le non-overridentoString()
en Java est de toute façon d'un usage limité.En tant qu'extension de ce que John a dit, si vous souhaitez extraire la représentation sous forme de chaîne et la stocker dans un,
std::string
procédez comme suit:std::stringstream
se trouve dans l'en-<sstream>
tête.la source
La question a reçu une réponse. Mais je voulais ajouter un exemple concret.
Cet exemple nécessite de comprendre la surcharge de l'opérateur.
la source