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++/CLI Discussion :

vector en variable d'instance


Sujet :

C++/CLI

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Par défaut vector en variable d'instance
    Bonjour,
    je débute un peu en programmation orientée objet et j'aimerais créer une variable d'instance qui soit un vector.

    Dans mon fichier .h j'écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private:
            std::vector<int> tableau;
    puis mon constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau= new vector<int>();
    Mais il me dit que vector n'a pas était déclaré alors que je fais #include <vector>

    Pouvez-vous m'aider svp ? merci

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Pour avoir un std::vector membre privé d'une classe dont tu spécifies la taille au constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // TaClass.hpp
    // Ajouter les ifndef
    #include <vector>
     
    class TaClass
    {
    public:
        TaClass(unsigned int taille);
    private:
        std::vector<int> tableau;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // TaClass.cpp
    #include "TaClass.hpp"
     
    TaClass::TaClass(unsigned int taille) : tableau(taille) { }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // main.cpp
    #include "TaClass.hpp"
     
    int main()
    {
        TaClass test(4);
        // ...
        return 0;
    }

    De façon générale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<int> tableau(4);
    tableau.resize(10);
    fonctionne, pas besoin d'allocation dynamique (avec new)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Par défaut
    ça marche, merci beaucoup Ehonn !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    j'ai juste une autre question, j'aimerais passer par un pointeur pour faire ça, et ajouter une fonction pour ajouter un élément dans le vecteur, voici mon code :

    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
     
    //fichier h
    class MaClass
    {
    	public:
    		MaClass();
    		void add(int i);
     
     
    	private:
            std::vector<int> *chaine;
    };
     
    //fichier cpp
    #include "MaClass.h" 
    #include <vector>
     
     
    using namespace std;
     
    MaClass::MaClass()
    {
        vector<int> temp;
        chaine = &temp; 
    }
     
    void MaClass::add(int i)
    {
        *chaine.push_back(i);
    }
    mais il me sort l'erreur
    18 `push_back' in `((MaClass*)this)->MaClass::chaine', which is of non-class type `std::vector<int, std::allocator<int> >*'
    Sans la fonction add le code ce compile bien, as-tu une idée stp ?

    encore merci

  5. #5
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Il faut utiliser les pointeurs seulement lorsqu'on est obligé !

    Ton membre privé doit être
    et non
    Si tu ne veux pas donner de taille au constructeur celui ci sera tout simplement le constructeur par défaut (mais tu peux écrire quand même ceci)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasse::MaClasse() { }
    Pour ta méthode add, elle ressemblera à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void MaClasse::add(int elem) { m.push_back(elem); }
    ---

    Ton constructeur est faux car:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MaClass::MaClass()
    {
    vector<int> temp;
    chaine = &temp;
    }
    temp est construit, tu récupères son emplacement mémoire dans chaine et temp est détruit car il n'existe que dans le constructeur (car déclarer dedans) et donc chaine pointe vers une adresse mémoire invalide !

    La solution (à éviter au maximum) est de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MaClass::MaClass()
    {
    chaine = new std::vector<int>();
    }
     
    MaClass::~MaClass()
    {
    delete chaine;
    }
    Celui qui alloue la mémoire doit la libérer. On écrit donc le destructeur qui va bien

    ---

    Si tu vraiment besoin d'avoir un pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<int> * pVec = new std::vector<int>();
    pVec->push_back(5);
    (*pVec).push_back(-3);
    delete pVec;
    À éviter au maximum !

    ---

    [Aucun code testé]

Discussions similaires

  1. redéfinition de variable d'instance
    Par swinger45 dans le forum Langage
    Réponses: 8
    Dernier message: 27/09/2006, 18h34
  2. Collection et variable non instancié
    Par david06600 dans le forum Langage
    Réponses: 1
    Dernier message: 17/08/2006, 14h23
  3. Variable d'instance et classe anonyme
    Par zoullou dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 21/05/2006, 12h30
  4. [POO] Retrouver une variable d'instance de classe
    Par stailer dans le forum Langage
    Réponses: 1
    Dernier message: 18/02/2006, 10h56
  5. "class" vector à indice variable et fonction membr
    Par icetechnik dans le forum C++
    Réponses: 14
    Dernier message: 25/11/2005, 23h46

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