IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

destruction non souhaitée


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut destruction non souhaitée
    Bonjour

    J'ai une situation "complexe" que j'ai simplifié dans un exemple stupide mais qui n'est finalement pas si simple.

    J'ai une classe "Tree", qui contient un vecteur de classes "Branch" qui elle même contient un vecteur de "Leaf".

    Une quatrième classe MotherNature peut attacher des feuilles à un arbre passé en argument.
    void fastenLeaf(Tree t);

    Finalement j'ai un dernier fichier qui est ma fonction main.
    voyez plutôt :

    Leaf.h
    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
    #pragma once
     
    #include <string>
    #include <sstream>
     
    using namespace std;
     
    class Leaf
    {
    private :
    	int width, height;
    	string colour;
    public:
    	Leaf(void);
    	Leaf(int width, int height, string colour);
    	~Leaf(void);
    	string toString();
    };
    Leaf.cpp
    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
    #include "Leaf.h"
     
    Leaf::Leaf(void)
    {
    }
     
    Leaf::Leaf(int w, int h, string c)
    {
    	width = w;
    	height = h;
    	colour = c;
    }
     
    Leaf::~Leaf(void)
    {
    }
     
    string Leaf::toString()
    {
    	ostringstream oss;
    	oss << "Leaf : " << width << "x" << height << " : " << colour;
    	return oss.str();
    }
    Branch.h
    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
    #pragma once
     
    #include <sstream>
    #include <string>
    #include <vector>
     
    #include "Leaf.h"
     
    using namespace std;
     
    class Branch
    {
    private :
    	int length;
    	vector<Leaf> vect_leaf;
    public:
    	Branch(void);
    	Branch(int length);
    	~Branch(void);
    	int getLenght();
    	vector<Leaf> getAllLeafs();
    	void addLeaf(Leaf leaf);
    	string toString();
    };
    branch.cpp
    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
    31
    32
    33
    34
    35
    36
    37
    38
    #include "Branch.h"
    #include <iostream>
     
    Branch::Branch(void)
    {
    }
     
    Branch::Branch(int l)
    {
    	length = l;
    }
     
    Branch::~Branch(void)
    {
    }
     
    int Branch::getLenght()
    {
    	return length;
    }
     
    vector<Leaf> Branch::getAllLeafs()
    {
    	return vect_leaf;
    }
     
    void Branch::addLeaf(Leaf leaf)
    {
    	vect_leaf.push_back(leaf);
    	std::cout << "1 leaf added" << endl;
    }
     
    string Branch::toString()
    {
    	ostringstream oss;
    	oss << "Branch : " << length << " " << vect_leaf.size() << "leaf(s)";
    	return oss.str();
    }
    Tree.h
    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
    #pragma once
     
    #include <vector>
     
    #include "Branch.h"
     
    class Tree
    {
    private :
    	int height;
    	vector<Branch> vect_branch;
    public:
    	Tree(void);
    	~Tree(void);
    	void addBranch(Branch br);
    	vector<Branch> getAllBranches();
    	Branch getSpecificBranch(int length);
    	int countLeafs();
    };
    Tree.cpp
    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
    31
    32
    33
    34
    35
    36
    37
    38
    #include "Tree.h"
     
    Tree::Tree(void)
    {
    }
     
    Tree::~Tree(void)
    {
    }
     
    void Tree::addBranch(Branch b)
    {
    	vect_branch.push_back(b);
    }
     
     
    vector<Branch> Tree::getAllBranches()
    {
    	return vect_branch;
    }
     
    Branch Tree::getSpecificBranch(int length)
    {
    	for(size_t i=0 ; i<vect_branch.size() ; i++)
    	{
    		if(vect_branch[i].getLenght() == length)
    			return vect_branch[i];
    	}
    	return Branch();
    }
     
    int Tree::countLeafs()
    {
    	int nbLeafs = 0;
    	for(size_t j=0 ; j<vect_branch.size() ; j++)
    		nbLeafs += vect_branch[j].getAllLeafs().size();
    	return nbLeafs;
    }
    MotherNature.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #pragma once
     
    #include <iostream>
     
    #include "Tree.h"
     
    class MotherNature
    {
    public:
    	MotherNature(void);
    	~MotherNature(void);
    	void fastenLeaf(Tree t);
    };
    MotherNature.cpp
    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
    #include "MotherNature.h"
     
    MotherNature::MotherNature(void)
    {
    }
     
    MotherNature::~MotherNature(void)
    {
    }
     
    void MotherNature::fastenLeaf(Tree t)
    {
    	int w, h;
    	string c;
    	Branch br = t.getSpecificBranch(10);
    	std::cout << "width height colour : ";
    	std::cin >> w >> h >> c;
    	Leaf lea(w,h,c);
    	br.addLeaf(lea);
    }
    test.cpp
    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
    #include "Tree.h"
    #include "Branch.h"
    #include "MotherNature.h"
     
    int main()
    {
    	Tree t;
    	Branch b1(9), b2(10), b3(11);
    	t.addBranch(b1);
    	t.addBranch(b2);
    	t.addBranch(b3);
     
    	MotherNature mn;
    	mn.fastenLeaf(t);
     
    	cout << "Amount of leaves : " << t.countLeafs() << endl;
    }
    Le souci c'est qu'à l'affichage j'ai :

    width height colour : 10 10 green
    1 leaf added
    amount of leaves : 0

    je suppose donc que la feuille que j'ajoute est détruite ... et ça m'ennuie ...

    Merci à ceux qui prendront le temps de me donner un coup de main

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    GetSpecificBranch retourne une copie de la branche et non la branche elle-même : Tu n'es pas en Java ici...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut
    Bonjour

    merci d'avoir jeté un œil à mon souci.

    J'ai essayé de modifié ma méthode GetSpecificBranch pour qu'elle renvoie l'adresse de la "Branch" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Branch* Tree::getSpecificBranch(int length)
    {
    	for(size_t i=0 ; i < vect_branch.size() ; i++)
    	{
    		if(vect_branch[i].getLenght() == length)
    			return &vect_branch[i];
    	}
    	return 0;
    }
    Et dont j'ai aussi modifié l'endroit où j'appelle ma méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void MotherNature::fastenLeaf(Tree t)
    {
    	int w, h;
    	string c;
    	Branch* br = t.getSpecificBranch(10);
    	std::cout << "width height colour : ";
    	std::cin >> w >> h >> c;
    	Leaf lea(w,h,c);
    	br->addLeaf(lea);
    }
    mais j'ai toujours le souci.
    à l'affichage, il me dit 0 feuilles

    Je sais que je code en C++ comme je code en java mais je n'arrive pas encore à penser en C++

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void MotherNature::fastenLeaf(Tree t)
    Même problème...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut
    J'aime bien tes réponses, parce qu'elles m'obligent à réfléchir ...

    voilà comment j'ai résolu mon problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void MotherNature::fastenLeaf(Tree *t)
    {
    	int w, h;
    	string c;
    	Branch* br = t->getSpecificBranch(10);
    	std::cout << "width height colour : ";
    	std::cin >> w >> h >> c;
    	Leaf lea(w,h,c);
    	br->addLeaf(lea);
    }
    merci de ton aide

    Je n'arrive juste pas à bien comprendre le scope. Pourquoi mon objet "Leaf lea", lui n'est pas détruit quand je quitte la méthode ?
    Ou alors peut-être est-il détruit et c'est une copie qui se trouve dans mon vecteur de feuilles ...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Oui, c'est une copie.

    En fait, je vois deux choix possibles ici:
    • Faire un arbre/graphe uniquement de pointeurs, avec les problèmes de destruction que cela comporte.
    • Faire un arbre/graphe uniquement de copie, mais dont les éléments peuvent être accédés par pointeur (en clair, ajouter un élément à l'arbre le copie, mais accéder à l'arbre ne copie rien)

    Et je conseillerais plutôt la seconde solution.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JDOM] Element Text non souhaité dans la construction
    Par alex.nd dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 24/10/2006, 14h38
  2. suppression de context non souhaité
    Par 205 dans le forum Tomcat et TomEE
    Réponses: 14
    Dernier message: 26/09/2006, 14h27
  3. Appel de procedure non souhaité
    Par DURVILLE dans le forum Delphi
    Réponses: 2
    Dernier message: 24/09/2006, 16h19
  4. [Débutant] Enregistrement non souhaité.
    Par Monsieur Peck dans le forum Access
    Réponses: 1
    Dernier message: 11/06/2006, 14h40
  5. Raffraichissement de Combobox non souhaité
    Par Kara dans le forum Composants VCL
    Réponses: 12
    Dernier message: 04/11/2005, 09h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo