web-dev-qa-db-fra.com

remplacement toString en C ++

En Java, quand une classe remplace .toString() et que vous faites System.out.println() elle l'utilisera.

class MyObj {
    public String toString() { return "Hi"; }
}
...
x = new MyObj();
System.out.println(x); // prints Hi

Comment puis-je accomplir cela en C++, de sorte que:

Object x = new Object();
std::cout << *x << endl;

Produira une représentation de chaîne significative que j'ai choisie pour Object?

34
Aillyn
std::ostream & operator<<(std::ostream & Str, Object const & v) { 
  // print something from v to str, e.g: Str << v.getX();
  return Str;
}

Si vous écrivez ceci dans un fichier d'en-tête, n'oubliez pas de marquer la fonction en ligne: inline std::ostream & operator<<(... (Voir la Super-FAQ C++ pour savoir pourquoi .)

52
Erik

Alternative à la solution d'Erik, vous pouvez remplacer l'opérateur de conversion de chaîne.

class MyObj {
public:
    operator std::string() const { return "Hi"; }
}

Avec cette approche, vous pouvez utiliser vos objets partout où une sortie de chaîne est nécessaire. Vous n'êtes pas limité aux flux.

Cependant, ce type d'opérateurs de conversion peut entraîner des conversions involontaires et des bogues difficiles à tracer. Je recommande d'utiliser ceci uniquement avec des classes qui ont une sémantique de texte, comme un Path, un UserName et un SerialCode.

31
Tugrul Ates
 class MyClass {
    friend std::ostream & operator<<(std::ostream & _stream, MyClass const & mc) {
        _stream << mc.m_sample_ivar << ' ' << mc.m_sample_fvar << std::endl;
    }

    int m_sample_ivar;
    float m_sample_fvar;
 };
4
Parsa Jamshidi

Bien que le remplacement de l'opérateur soit une bonne solution, je suis à l'aise avec quelque chose de plus simple comme celui-ci (qui semble également plus probable pour Java):

char* MyClass::toString() {
    char* s = new char[MAX_STR_LEN];
    sprintf_s(s, MAX_STR_LEN, 
             "Value of var1=%d \nValue of var2=%d\n",
              var1, var2);
    return s;
}
2
Touhid