2017-06-20 1 views
0

Je suis surchargée operator<< comme ceci:Comment éviter l'utilisation de std :: stringstream.str() et de std :: stringstream.clear() en réutilisant la variable std :: stringstream?

std::ostream& operator<<(std::ostream& os, SomeClass C){ 
//SomeClass is the class to be represented with operator overloading 
os << "{ "; 
os << C.getPropertyA() << " "; 
os << C.getPropertyB() << " }"; 
//getPropertyA(), getPropertyB():functions of 'SomeClass' that return std::string 
return os; 
} 

Maintenant, je suis en utilisant googletest pour tester operator<< surcharge comme ceci:

SomeClass C1; 
SomeClass C2; 
. 
. 
std::stringstream ss; 
std::string str; 

//First test 
ss << C1; 
std::getline(ss, str); 
EXPECT_EQ("<some expected value>", str); // googletest test 

//Second test 
ss.str("");ss.clear(); //Mandatory if 'ss' need to be reused 
ss << C2; 
std::getline(ss, str); 
EXPECT_EQ("<some expected value>", str); // googletest test 
. 
. 
//Some more use 'ss' follows 

Maintenant, le problème est à chaque fois que j'ajouter un nouveau test I besoin d'ajouter ss.str("");ss.clear(); avant le test, apparemment vide flux et effacer état d'erreur. Cet appel répété de deux fonctions std::stringstream me fait penser que je fais quelque chose de mal.

D'où j'ai besoin d'aide principalement:

  • Comment réutiliser la variable std::stringstream 'ss' sans appeler ss.str("");ss.clear(); encore et encore OU
  • meilleure alternative à la mise en œuvre test pour operator<< surchargé en utilisant googletest.
+0

Vous n'avez pas besoin d'appeler les deux str() et clair(). Les deux appels font la même chose. Ou l'autre est suffisant pour ce que vous voulez faire. Je ne pense pas que l'utilisation d'une variable stringstream séparée apportera de la lisibilité à votre code. en utilisant soit str ("") ou clear() (mon choix personnel) rend votre intention assez claire, et est plus efficace que de créer un nouveau strings à partir de zéro. –

+0

@ MichaëlRoy [ici] (https://stackoverflow.com/questions/12112259/how-to-reuse-stringstream) la réponse acceptée indique qu'il est nécessaire d'appeler clear() même après avoir appelé str (""). Pour moi en utilisant seulement str ("") fonctionne bien cependant. – MasterJEET

+0

@ MichaëlRoy L'utilisation de 'clear()' ne fonctionne pas non plus. – MasterJEET

Répondre

5

Vous n'avez pas besoin de getline à partir du flux de chaînes car vous pouvez accéder directement au stockage sous-jacent. L'approche plus simple serait de créer de nouvelles stringstream pour chaque test:

//First test 
{ 
    SomeClass C1; 
    . 
    std::stringstream ss; 
    ss << C1; 
    EXPECT_EQ("<some expected value>", ss.str()); // googletest test 
} 

//Second test 
{ 
    SomeClass C2; 
    . 
    std::stringstream ss; 
    ss << C2; 
    EXPECT_EQ("<some expected value>", ss.str()); // googletest test 
} 
+0

Merci d'avoir signalé l'utilisation redondante de 'getline()'. Je m'en tiens à la suggestion de MichaëlRoy pour le moment. – MasterJEET