Rechercher : dans
Par :

Compteur d'objets(c++)

Dernière réponse le 24 mar 2009 à 01:59:01 bleach, le 6 nov 2008 à 18:23:08 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « compteur d'objets(c++) » dans :
Les objets en langage C++ Voir La création d'objets En C++, il existe deux façons de créer des objets, c'est-à-dire d'instancier une classe : de façon statique de façon dynamique La création statique La création statique d'objets consiste à créer un objet en lui affectant un...
Les classes en langage C++ VoirLa notion d'objet Le langage C est un langage procédural, c'est-à-dire que c'est un langage permettant de définir des données grâce à des variables, et des traitements grâce aux fonctions. L'apport principal du langage C++ par rapport au...
Classe et instance d'objet VoirLa notion de classe On appelle classe la structure d'un objet, c'est-à-dire la déclaration de l'ensemble des entités qui composeront un objet. Un objet est donc « issu » d'une classe, c'est le produit qui sort d'un moule. En réalité on dit qu'un...
Langage C - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...

1

Quatra, le 16 mar 2009 à 18:16:17

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

Répondre à Quatra

2

loupius, le 16 mar 2009 à 18:49:15

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.

Répondre à loupius

3

Quatra, le 16 mar 2009 à 18:53:31

Une variable statique est comme une variable locale ou globale, donc c'est une variable non initialisée.

Répondre à Quatra

5

loupius, le 17 mar 2009 à 14:22:30

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.

Répondre à loupius

6

mamiemando, le 24 mar 2009 à 01:29:26

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

Répondre à mamiemando

7

fiddy, le 24 mar 2009 à 01:43:16
  • +1

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
Google is your friend

Répondre à fiddy

8

 mamiemando, le 24 mar 2009 à 01:59:01

Effectivement... Bon ceci dit, ça ne mange pas de pain de l'initialiser.

Répondre à mamiemando

4

mamiemando, le 16 mar 2009 à 20:52:55
  • +1

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

Répondre à mamiemando