Bonjour,

Je souhaiterai saisir des vers, puis afficher ma strophe, comme ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
int main()
{
    Strophe S1;
    cin >> S1;
    cout << S1 << endl;
}
Voici une partie de mon (micro)projet.
(j'ai supprimé les #include)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Vers {
 
    private:
        string suiteMots;
        string rime;
 
    public:
        Vers();
        Vers(string s);
        Vers(string s, string r);
        virtual ~Vers();
        virtual string getSuiteMots() const;
        virtual void saisie(istream& is);
        void affiche(ostream& os) const;
};
 
ostream& operator<<(ostream& os, const Vers& v);
istream& operator>>(istream& is, Vers& v);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Vers::Vers(){}
Vers::Vers(string sm){ suiteMots=sm;}
Vers::Vers(string sm, string r) { suiteMots=sm; rime= r;}
Vers::~Vers(){}
 
void Vers::saisie(istream& is) { 
    cout << "Entrez le vers." << endl; 
    getline(is,suiteMots); 
}
 
void Vers::affiche(ostream& os) const { os << "<<" << suiteMots << ">>";}
 
ostream& operator<<(ostream& os, const Vers& v) {
    v.affiche(os);
    return os;
}
 
istream& operator>>(istream& is, Vers& v) {
    v.saisie(is);
    return is;
}

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Strophe {
 
    private:
        Vers** suiteVers;
        int nbVers;
 
    public:
        Strophe();
        virtual ~Strophe();
        virtual void saisie(istream& is);
        virtual void affiche(ostream& os) const;
};
 
ostream& operator<<(ostream& os, const Strophe& s);
istream& operator>>(istream& is, Strophe& s);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Strophe::Strophe(){suiteVers=NULL; nbVers=0;}
Strophe::~Strophe(){if (suiteVers) delete[] suiteVers;}
 
void Strophe::saisie(istream& is) {
    if (suiteVers) delete[] suiteVers;
    cout << "Entrer le nombre de vers : " << endl;
    is >> nbVers;
    suiteVers = new Vers*[nbVers];
    for (int i=0; i<nbVers; i++) {
        Vers *v = new Vers();
        v->saisie(is);
        suiteVers[i] = v;
    }
}
 
void Strophe::affiche(ostream& os) const {
    for (int i=0; i<nbVers; i++) {
        suiteVers[i]->affiche(os); os << endl;
    }
}
 
ostream& operator<<(ostream& os, const Strophe& s) {
    s.affiche(os);
    return os;
}
 
istream& operator>>(istream& is, Strophe& s) {
    s.saisie(is);
    return is;
}
Au début lorsque je saisissai un vers, seul le premier mot était stocké.
Après une petite recherche, j'ai compris fallait utiliser getline().

Sauf que maintenant j'ai un autre problème, lorsque je dis a mon programme que je veux saisir x vers. Il va laisser le 1er vide et me demander de saisir les x-1 autres...

Concrètement,

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Entrer le nombre de vers
3                         // saisie au clavier
Entrer le vers.
Entrer le vers.
Vers 1                  // saisie au clavier
Entrer le vers.
Vers 2.                // saisie au clavier
// affichage de ma strophe
<<>>
<<Vers 1>>
<<Vers 2>>
Je pense que le problème vient de mon "getline(is,suiteMots)" parce que si je le replace par "is >> suiteMots" je n'ai plus de ce problème.

Quelqu'un peut m'éclairer?