2010-06-17 7 views

Répondre

17

La mise en œuvre canonique de l'opérateur de sortie pour tout type T est la suivante:

std::ostream& operator<<(std::ostream& os, const T& obj) 
{ 
    os << obj.get_data1() << get_data2(); 
    return os; 
} 

Notez que les opérateurs de flux de sortie ne sont généralement pas des fonctions membres. (En effet, pour que les opérateurs binaires soient des fonctions membres, ils doivent être membres de leur type d'argument de gauche, mais pas de votre propre type, à l'exception de quelques surcharges de operator<<() pour certaines fonctions intégrées. , qui sont membres de la classe de flux de sortie.)
cet effet, sinon toutes les données de T est accessible au public, cet opérateur doit être un ami de T

class T { 
    friend std::ostream& operator<<(std::ostream&, const T&); 
    // ... 
}; 

ou l'opérateur appelle une fonction publique qui ne le streaming:

class T { 
public: 
    void write_to_stream(std::ostream&); 
    // ... 
}; 

std::ostream& operator<<(std::ostream& os, const T& obj) 
{ 
    obj.write_to_stream(os); 
    return os; 
} 

L'avantage de ce dernier est que la fonction membre write_to_stream() peut être virtual (et pure), permettant la diffusion de classes polymorphes.

Si vous voulez être de fantaisie et de soutenir tous les types de flux, vous auriez à ce que créer des modèles à:

template< typename TCh, typename TTr > 
std::basic_ostream<TCh,TTr>& operator<<(std::basic_ostream<TCh,TTr>& os, const T& obj) 
{ 
    os << obj.get_data1() << get_data2(); 
    return os; 
} 

(. Modèles, cependant, ne fonctionnent pas avec des fonctions virtuelles)

+0

OMG 3 secondes et vous obtenez 3 vote jusqu'à? – Arpegius

+0

Où 'T' est le type de l'objet' k' que vous voulez imprimer. – MSalters

+0

ouah! waht est "T" (dans le "const T & obj"). et comment puis-je l'ajouter à ma classe k? – aharon