Compteur d'objets(c++)

Résolu
bleach -  
 great -
salut,

j'ai ecris ce petit programme rien que pour tester un comteur d'instance
-------------------------------------------------------------------------------------------------
#include<iostream.h>
#include<conio.h>
class Ob
{
int c;
static int compteur;
public:
Ob();
void afficher();
void modiffier(int);
void nbOB();
int affichnbOb();
~Ob();
};
Ob :: Ob(){
c=0;
compteur++;
}
void Ob :: afficher() {
cout <<"\n la valeeur est :"<<c;
}
void Ob :: modiffier(int v)
{
this->c=v;
}
int Ob :: affichnbOb()
{
return compteur();
}
Ob :: ~Ob()
{
compteur--;
}
void main()
{
Ob p1;
p1.modiffier(8);
p1.afficher();
cout <<" le nombres d'objets jusqu'a maintenet est :"<<p2.;
getch();
}
----------------------------------------------------------------------------------------
mes j'ai toujours cette erreur
:
undefined symbol ob::comteur is module TEST.CPP
qulqu'un peut m'aidez ?
Configuration: Windows XP
Firefox 2.0.0.17

4 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    Voici le corrigé :
    #include <iostream>
    // et non <iostream.h> qui est obsolète
    // pas besoin de <conio.h> qui n'est pas standard
    
    class A{
        protected:
            static unsigned compteur;
        public:
            A(){
                ++compteur;
            }
    
            ~A(){
                --compteur;
            }
    
            static inline unsigned get_compteur(){
                return compteur;
            }
    };
    
    unsigned A::compteur = 0;
    
    int main(){
    
        std::cout << "1) " << A::get_compteur() << std::endl;
        {
            A a1;
            std::cout << "2) " << A::get_compteur() << std::endl;
            A a2,a3;
            std::cout << "3) " << A::get_compteur() << std::endl;
        }
        std::cout << "4) " << A::get_compteur() << std::endl;
        return 0;
    }
    

    ce qui donne :
    1) 0
    2) 1
    3) 3
    4) 0
    
    Bonne chance
    3
  2. Quatra
     
    Salut,

    Il faut que tu initialises ta variable static avant de faire des manipulations.

    Met cette ligne dans ton implémentation de la classe.
    int Ob::compteur=0;
    Tu peux placer cette ligne n'importe où mais je te conseil de le mettre près de ton implémentation du constructeur de ta classe Ob.

    bonne journée
    2
  3. loupius
     
    undefined symbol ob::comteur is module TEST.CPP
    Ah, ah, ah, sur les forums on peut faire toutes les fautes de français que l'on veut même au risque de ne pas se faire comprendre... mais dans un programme, le compilateur le refusera... alors si l'on a choisi d'écrire compteur il ne faut pas ensuite lui demander comteur !!! ;-)
    Nota: par défaut, les variables statiques sont initialisées à zéro.
    1
    1. Quatra
       
      Une variable statique est comme une variable locale ou globale, donc c'est une variable non initialisée.
      0
      1. loupius > Quatra
         
        Je persiste, en C et C++, les variables persistantes (déclarées globales et/ou statiques) sont, par défaut, initialisées à 0, c'est la norme qui l'impose. Evidemment tu n'est pas obligé d'utiliser un compilateur qui réponde à la norme.
        0
      2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943 > loupius
         
        Je veux bien voir ta norme...
        (mando@aldur) (~) $ gcc --version
        gcc (Debian 4.3.2-1.1) 4.3.2
        Copyright (C) 2008 Free Software Foundation, Inc.
        This is free software; see the source for copying conditions.  There is NO
        warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
        
        (mando@aldur) (~) $ cat plop.c
        #include <stdio.h>
        int main(){
                int i;
                printf("%d\n",i);
                return 0;
        }
        
        (mando@aldur) (~) $ gcc plop.c
        
        (mando@aldur) (~) $ ./a.out
        -1208765872
        
        En tout cas avec gcc la variable n'est pas intialisée à 0.

        Bonne chance
        0
      3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847 > mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Salut,
        Loupius a raison.
        En C/C++, les variables persistantes (déclarées globales et/ou statiques ) sont initialisées à leur valeur nulle.
        Il n'y a qu'à lire la norme ;-)).

        Dans ton exemple, tu utilises une variable locale classique. Tricherie ;-)).
        Teste avec static devant pour t'en convaincre ou mets là en global.

        Cdlt
        0
      4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943 > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Effectivement... Bon ceci dit, ça ne mange pas de pain de l'initialiser.
        0
  4. great
     
    merci bcp.cette question ainsi que les commentaires ont vraiment m'aider dans mon exercice qui apparais comme ceci
    1