Question

When I run the following code in VS2013:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Auteur {
public:
    Auteur(string n, bool p = false)
    : nom(n), prime(p)
    {}
    const string getNom(){
        return nom;
    }
    bool getPrix(){
    return prime;
    }
   //Auteur(const Auteur&) = delete;

private:
   string nom;
   bool prime;
   };
class Oeuvre{
public:
    Oeuvre(string t, Auteur &a, string lang)
    : titre(t), langue(lang), auteur(a)
    {}
     tring getTitre(){
    return titre;
     }
const Auteur & getAuteur(){
    return auteur;
     }
    string getLangue(){
    return langue;
     }
    void affiche(){
    cout << titre << " ," << auteur.getNom() << " en " << getLangue() << endl;
    }

   ~Oeuvre(){
    cout << "L'oeuvre " <<titre << ", " << auteur.getNom() << ", en " << langue     << " n'est plus disponible." << endl;
   }
   //Oeuvre(const Oeuvre&) = delete;
 private:
    string titre;
    Auteur &auteur;
string langue;
};

class Exemplaire{
public:
Exemplaire(Oeuvre & oeuvre)
    : oeuvre(oeuvre)
{
    Auteur a = oeuvre.getAuteur();
    cout << "Nouvel exemplaire de : " << oeuvre.getTitre() << ", " << a.getNom() <<" en " << oeuvre.getLangue() << endl;
}
Exemplaire(Exemplaire const& ex)
    : oeuvre(ex.oeuvre)
{
    Auteur a = oeuvre.getAuteur();
    cout << "Copie d'un exemplaire de : " << oeuvre.getTitre() << ", " << a.getNom() << ", en " << oeuvre.getLangue() << endl;
}
const Oeuvre & getOeuvre() const{
    return oeuvre;
}
void affiche(){
    Auteur a = oeuvre.getAuteur();
    cout << "Exemplaire de : " << oeuvre.getTitre() << ", " << a.getNom() << ", en " << oeuvre.getLangue() << endl;
}
~Exemplaire(){
    Auteur a = oeuvre.getAuteur();
    cout << "Un exemplaire de " << oeuvre.getTitre() << ", " << a.getNom() << ", en " << oeuvre.getLangue() << " a été jeté !" << endl;
 }

private:
Oeuvre  &oeuvre;
};
class Bibliotheque{
public:
Bibliotheque(string nom)
    : nom(nom)
{
    cout << "La bibliothèque " << nom << " est ouverte !" << endl;
}
string getNom(){
    return nom;
}
void stocker(Oeuvre &oeuvre, int n = 1)
{
    for (int i = 0; i < n; i++){
        exp.push_back(new Exemplaire(oeuvre));
    }
}
void lister_exemplaires(string langue = ""){
    int taille = exp.size();
    if (langue.empty() == true)
    {
        for (auto & ex : exp) {
            (*ex).affiche();
        }

    }
    else {
        for (int i(0); i<taille; i++)
        {
            Oeuvre o = exp[i]->getOeuvre();
            if (o.getLangue() == langue){
                exp[i]->affiche();
            }
        }
    }
}
int compter_exemplaires(Oeuvre ev){
    int ct = 0;
    for (auto &ex : exp) {
        Oeuvre ew = (*ex).getOeuvre();
        Auteur at = ew.getAuteur();
        Auteur a = ev.getAuteur();
        if (ew.getTitre() == ev.getTitre() && at.getNom() == a.getNom() && ew.getLangue() == ev.getLangue())
            ct++;
    }
    return ct;
}
void afficher_auteurs(bool b= false){
    for (auto & ex : exp)
    {
        Oeuvre ev = (*ex).getOeuvre();
        Auteur auteur = ev.getAuteur();
        string s = auteur.getNom();
        if (b){
            if (auteur.getPrix())
            cout << s << endl;
        }

    }

}
~Bibliotheque(){
    cout << "La bibliothèque " << getNom() << " ferme ses portes, \net détruit ses exemplaire :" << endl;
    int taille = exp.size();
    for (int i(0); i<taille; i++)
        delete exp[i];
}

 private:
string nom;
vector <Exemplaire *> exp;
 };


int main()
{
Auteur a1("Victor Hugo"),
    a2("Alexandre Dumas"),
    a3("Raymond Queneau", true);

Oeuvre o1("Les Misérables", a1, "français"),
    o2("L'Homme qui rit", a1, "français"),
    o3("Le Comte de Monte-Cristo", a2, "français"),
    o4("Zazie dans le métro", a3, "français"),
    o5("The Count of Monte-Cristo", a2, "anglais");

Bibliotheque biblio("municipale");
biblio.stocker(o1, 2);
biblio.stocker(o2);
biblio.stocker(o3, 3);
biblio.stocker(o4);
biblio.stocker(o5);

cout << "La bibliothèque " << biblio.getNom()
    << " offre les exemplaires suivants :" << endl;
biblio.lister_exemplaires();

const string langue("anglais");
cout << " Les exemplaires en " << langue << " sont :" << endl;
biblio.lister_exemplaires(langue);

cout << " Les auteurs à succès sont :" << endl;
biblio.afficher_auteurs(true);

cout << " Il y a " << biblio.compter_exemplaires(o3) << " exemplaires de "
    << o3.getTitre() << endl;

return 0;
}

I get the following output:

La bibliothÞque municipale est ouverte !
Nouvel exemplaire de : Les MisÚrables, Victor Hugo en franþais
Nouvel exemplaire de : Les MisÚrables, Victor Hugo en franþais
Nouvel exemplaire de : L'Homme qui rit, Victor Hugo en franþais
Nouvel exemplaire de : Le Comte de Monte-Cristo, Alexandre Dumas en franþais
Nouvel exemplaire de : Le Comte de Monte-Cristo, Alexandre Dumas en franþais
Nouvel exemplaire de : Le Comte de Monte-Cristo, Alexandre Dumas en franþais
Nouvel exemplaire de : Zazie dans le mÚtro, Raymond Queneau en franþais
Nouvel exemplaire de : The Count of Monte-Cristo, Alexandre Dumas en anglais
La bibliothÞque municipale offre les exemplaires suivants :
Exemplaire de : Les MisÚrables, Victor Hugo, en franþais
Exemplaire de : Les MisÚrables, Victor Hugo, en franþais
Exemplaire de : L'Homme qui rit, Victor Hugo, en franþais
Exemplaire de : Le Comte de Monte-Cristo, Alexandre Dumas, en franþais
Exemplaire de : Le Comte de Monte-Cristo, Alexandre Dumas, en franþais
Exemplaire de : Le Comte de Monte-Cristo, Alexandre Dumas, en franþais
Exemplaire de : Zazie dans le mÚtro, Raymond Queneau, en franþais
Exemplaire de : The Count of Monte-Cristo, Alexandre Dumas, en anglais
 Les exemplaires en anglais sont :
L'oeuvre Les MisÚrables, Victor Hugo, en franþais n'est plus disponible.
L'oeuvre Les MisÚrables, Victor Hugo, en franþais n'est plus disponible.
L'oeuvre L'Homme qui rit, Victor Hugo, en franþais n'est plus disponible.
L'oeuvre Le Comte de Monte-Cristo, Alexandre Dumas, en franþais n'est plus disponible.
L'oeuvre Le Comte de Monte-Cristo, Alexandre Dumas, en franþais n'est plus disponible.
L'oeuvre Le Comte de Monte-Cristo, Alexandre Dumas, en franþais n'est plus disponible.
L'oeuvre Zazie dans le mÚtro, Raymond Queneau, en franþais n'est plus disponible.
Exemplaire de : The Count of Monte-Cristo, Alexandre Dumas, en anglais
L'oeuvre The Count of Monte-Cristo, Alexandre Dumas, en anglais n'est plus disponible.
 Les auteurs Ó succÞs sont :
L'oeuvre Les MisÚrables, Victor Hugo, en franþais n'est plus disponible.
L'oeuvre Les MisÚrables, Victor Hugo, en franþais n'est plus disponible.
L'oeuvre L'Homme qui rit, Victor Hugo, en franþais n'est plus disponible.
L'oeuvre Le Comte de Monte-Cristo, Alexandre Dumas, en franþais n'est plus disponible.
L'oeuvre Le Comte de Monte-Cristo, Alexandre Dumas, en franþais n'est plus disponible.
L'oeuvre Le Comte de Monte-Cristo, Alexandre Dumas, en franþais n'est plus disponible.
Raymond Queneau
L'oeuvre Zazie dans le mÚtro, Raymond Queneau, en franþais n'est plus disponible.
L'oeuvre The Count of Monte-Cristo, Alexandre Dumas, en anglais n'est plus disponible.
L'oeuvre Les MisÚrables, Victor Hugo, en franþais n'est plus disponible.
L'oeuvre Les MisÚrables, Victor Hugo, en franþais n'est plus disponible.
L'oeuvre L'Homme qui rit, Victor Hugo, en franþais n'est plus disponible.
L'oeuvre Le Comte de Monte-Cristo, Alexandre Dumas, en franþais n'est plus disponible.
L'oeuvre Le Comte de Monte-Cristo, Alexandre Dumas, en franþais n'est plus disponible.
L'oeuvre Le Comte de Monte-Cristo, Alexandre Dumas, en franþais n'est plus disponible.
L'oeuvre Zazie dans le mÚtro, Raymond Queneau, en franþais n'est plus disponible.
L'oeuvre The Count of Monte-Cristo, Alexandre Dumas, en anglais n'est plus disponible.
L'oeuvre Le Comte de Monte-Cristo, Alexandre Dumas, en franþais n'est plus disponible.
 Il y a 3 exemplaires de Le Comte de Monte-Cristo
La bibliothÞque municipale ferme ses portes,
et dÚtruit ses exemplaire :
Un exemplaire de Les MisÚrables, Victor Hugo, en franþais a ÚtÚ jetÚ !
Un exemplaire de Les MisÚrables, Victor Hugo, en franþais a ÚtÚ jetÚ !
Un exemplaire de L'Homme qui rit, Victor Hugo, en franþais a ÚtÚ jetÚ !
Un exemplaire de Le Comte de Monte-Cristo, Alexandre Dumas, en franþais a ÚtÚ jetÚ !
Un exemplaire de Le Comte de Monte-Cristo, Alexandre Dumas, en franþais a ÚtÚ jetÚ !
Un exemplaire de Le Comte de Monte-Cristo, Alexandre Dumas, en franþais a ÚtÚ jetÚ !
Un exemplaire de Zazie dans le mÚtro, Raymond Queneau, en franþais a ÚtÚ jetÚ !
Un exemplaire de The Count of Monte-Cristo, Alexandre Dumas, en anglais a ÚtÚ jetÚ !
L'oeuvre The Count of Monte-Cristo, Alexandre Dumas, en anglais n'est plus disponible.
L'oeuvre Zazie dans le mÚtro, Raymond Queneau, en franþais n'est plus disponible.
L'oeuvre Le Comte de Monte-Cristo, Alexandre Dumas, en franþais n'est plus disponible.
L'oeuvre L'Homme qui rit, Victor Hugo, en franþais n'est plus disponible.
L'oeuvre Les MisÚrables, Victor Hugo, en franþais n'est plus disponible.

Where Instead I should get the following output:

La bibliothèque municipale est ouverte !
Nouvel exemplaire de : Les Misérables, Victor Hugo, en français
Nouvel exemplaire de : Les Misérables, Victor Hugo, en français
Nouvel exemplaire de : L'Homme qui rit, Victor Hugo, en français
Nouvel exemplaire de : Le Comte de Monte-Cristo, Alexandre Dumas, en français
Nouvel exemplaire de : Le Comte de Monte-Cristo, Alexandre Dumas, en français
Nouvel exemplaire de : Le Comte de Monte-Cristo, Alexandre Dumas, en français
Nouvel exemplaire de : Zazie dans le métro, Raymond Queneau, en français
Nouvel exemplaire de : The Count of Monte-Cristo, Alexandre Dumas, en anglais
La bibliothèque municipale offre les exemplaires suivants :
Exemplaire de : Les Misérables, Victor Hugo, en français
Exemplaire de : Les Misérables, Victor Hugo, en français
Exemplaire de : L'Homme qui rit, Victor Hugo, en français
Exemplaire de : Le Comte de Monte-Cristo, Alexandre Dumas, en français
Exemplaire de : Le Comte de Monte-Cristo, Alexandre Dumas, en français
Exemplaire de : Le Comte de Monte-Cristo, Alexandre Dumas, en français
Exemplaire de : Zazie dans le métro, Raymond Queneau, en français
Exemplaire de : The Count of Monte-Cristo, Alexandre Dumas, en anglais
 Les exemplaires en anglais sont :
Exemplaire de : The Count of Monte-Cristo, Alexandre Dumas, en anglais
 Les auteurs à succès sont :
Raymond Queneau
 Il y a 3 exemplaires de Le Comte de Monte-Cristo
La bibliothèque municipale ferme ses portes,
et détruit ses exemplaires : 
Un exemplaire de "Les Misérables, Victor Hugo, en français" a été jeté !
Un exemplaire de "Les Misérables, Victor Hugo, en français" a été jeté !
Un exemplaire de "L'Homme qui rit, Victor Hugo, en français" a été jeté !
Un exemplaire de "Le Comte de Monte-Cristo, Alexandre Dumas, en français" a été jeté !
Un exemplaire de "Le Comte de Monte-Cristo, Alexandre Dumas, en français" a été jeté !
Un exemplaire de "Le Comte de Monte-Cristo, Alexandre Dumas, en français" a été jeté !
Un exemplaire de "Zazie dans le métro, Raymond Queneau, en français" a été jeté !
Un exemplaire de "The Count of Monte-Cristo, Alexandre Dumas, en anglais" a été jeté !
L'oeuvre "The Count of Monte-Cristo, Alexandre Dumas, en anglais" n'est plus disponible.
L'oeuvre "Zazie dans le métro, Raymond Queneau, en français" n'est plus disponible.
L'oeuvre "Le Comte de Monte-Cristo, Alexandre Dumas, en français" n'est plus disponible.
L'oeuvre "L'Homme qui rit, Victor Hugo, en français" n'est plus disponible.
L'oeuvre "Les Misérables, Victor Hugo, en français" n'est plus disponible.

Can you please tell me where is exactly the problem. why the Oeuvre class destructor is called before the end of main program ?

Was it helpful?

Solution

Inside your loops in 'afficher_auteurs', 'compter_exemplaires', etc, you are making copies of the objects, like this;

 Oeuvre ev = (*ex).getOeuvre();

so while getOeuvre is returning the object by reference, the receiver variable 'ev' is not receiving it by reference, and hence a copy is made. The destructor of these copied objects will be called on exit of the loop (when it goes out of scope) -- this is likely be the reason you are seeing the destructor running before the 'main' is completing.

Try fix this to change the code to receive by reference and see if that works, like this;

Oeuvre& ev = (*ex).getOeuvre();

or

const Oeuvre& ev = (*ex).getOeuvre();

and while you are at it, you probably want to declare all your methods on Oeuvre as 'const', like

const Auteur & getAuteur() const {....

as you otherwise will not be able to use those methods on a const object.

OTHER TIPS

The destructor for the Oeuvre class that you're seeing isn't for any of the variables initialized as directly in int main (e.g., o1, o2, etc.); it's for temporary variables used elsewhere in the program.

For example:

void afficher_auteurs(bool b= false){
for (auto & ex : exp)
{
    // **This is a temporary Oeuvre**
    Oeuvre ev = (*ex).getOeuvre();

    Auteur auteur = ev.getAuteur();
    string s = auteur.getNom();
    if (b){
        if (auteur.getPrix())
        cout << s << endl;
    }

} // **The temporary Oeuvre is destroyed here**

It's not unusual for destructors to be invoked before the end of the program. A destructor is invoked whenever an object is being destroyed.

Variables that are automatically allocated (i.e., on the stack), are automatically destroyed when they go out of scope.

Variables that are dynamically allocated (e.g., using new) are destroyed when they are explicitly deallocated (e.g., using delete).

the problem is here:

void lister_exemplaires(string langue = ""){
  int taille = exp.size();
  if (langue.empty() == true)
  {
    for (auto & ex : exp) {
        (*ex).affiche();
    }

  }
  else {
    for (int i(0); i<taille; i++)
    {
        /************************/
        Oeuvre o = exp[i]->getOeuvre();
        if (o.getLangue() == langue){
            exp[i]->affiche();
        }
        /************************/
    }
  }
}

You get the Oeuvre and make a local copy. When the for-loop ends, this temporary object is destroyed and its destructor called.

Use a reference instead:

const Oeuvre &o = exp[i]->getOeuvre();
//... as before
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top