2009-02-06 8 views
0

J'ai une fonction dans une classe qui retourne une chaîne. Dans cette fonction, je ne peux l'obtenir que lorsque j'ajoute à la fonction avant l'instruction return. Une idée de pourquoi c'est, ou comment je peux le réparer? Je suis en cela dans Eclipse sur un MacLa fonction C++ qui retourne la chaîne ne fonctionne pas à moins qu'il y ait un endl impliqué ...?

Dans "main.cpp":

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <cstdlib> 
#include "Braid.h" 
using namespace std; 

static int size=3; 

int main(){ 
Braid * b1 = new Braid(size); 
b1->setCanon();//creates canonical braid. 

cout<<"a "; 
cout<<b1->getName()<<endl; 
cout<<" b "; 
} 

Dans "Braid.h":

public: 
     Braid(int); 
     void setCanon(); 
     string getName(); 
    }; 

Et dans "Braid.cpp":

string Braid::getName(){ 
    string sName=""; 

    /* body commented out 
    for(int i=0; i<height; i++) 
    { 
     for(int j=2; j<(width-2); j++) 
      { 
       sName += boxes[i][j]; 
       sName += "|"; 
      } 
     } 

     */ 
     //cout<<endl; 
     return sName; 
    } 

Quand je lance mon code principal, sans que le corps de cette fonction a commenté, la sortie que je reçois est
"a 0 | 0 | 12 | 12 | 0 | 0 | 2 | 1 | 1 | 1 | 1 | 2 |"

Le "nom" qu'il renvoie est correct, mais il ne dépasse pas l'appel de fonction. Si je décommentez la ligne //cout<<endl, la fonction fonctionne et ma sortie est
"un 0 | 0 | 12 | 12 | 0 | 0 | 2 | 1 | 1 | 1 | 1 | 2 |
b"

Après avoir commenté le corps de la fonction, afin qu'elle crée seulement une chaîne vide, et la renvoie, ma sortie est seulement "a" puis si j'ajoute l'endl back, j'obtiens le "ab" attendu.

Qu'est-ce que je fais mal? Y at-il quelque chose qui vient avec endl que je manque?

Répondre

12

effectivement La fonction getName() fonctionne probablement correctement. Cependant, le cout «met en cache» la sortie (c'est-à-dire qu'il imprime la sortie à l'écran lorsque le tampon de texte interne est plein). 'endl' vide le buffer et force cout à vider le texte (en cache) à l'écran.

Essayez cout.flush() dans main.cpp

+0

Cela a fait l'affaire. Je suppose que cout ne fonctionne pas exactement comme je le pensais. Quoi qu'il en soit, merci! – Perchik

+0

cout n'est pas vraiment une déclaration d'impression autant que quelque part pour stocker une sortie. – helloandre

3

Peut-être que votre terminal est paresseux. Essayez d'omettre le endl et insérez cout.flush() comme ligne suivante.

2

coutdevrait être rincé à la fin du programme.

[email protected] ~ % cat blah.cpp 
#include <iostream> 

int main() { 
    std::cout << sizeof(int); 
} 
[email protected] ~ % ./a.out 
4 
+0

J'ai cependant rencontré quelques vieilles stations de travail Sun. – mdm

Questions connexes