begin process at 2012 05 30 07:29:31
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Divers

 > 

Question sur les pointeurs


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Question sur les pointeurs

mercredi 26 mars 2003 à 20:59:14 | Question sur les pointeurs

Darkneon

Voici un programme tiree de "Simple C++"



#include <string.h>
#include <iostream.h>

class Court
{
private:
//attributes
char *firstName;
char *secondName;
int count;

//private methods
int GetSlot();
public:
//constructors & destructors
Court();
Court(char *first, char *second);
~Court();

// Changing information
int PersonEnters(char *name);
void PersonLeaves(char *name);

//getting information
void WhosInFirst(char *buffer);
void WhosInSecond(char *buffer);
int CountPeople();

};

Court::Court()
{
firstName = new char[50];
secondName = new char[50];
strcpy(firstName, "");
strcpy(secondName, "");
count = 0;
}

Court::Court(char *first, char *second)
{
firstName = new char[50];
secondName = new char[50];
strcpy(firstName, first);
strcpy(secondName, second);
count = 2;
}

Court::~Court()
{
delete firstName;
delete secondName;
}

int Court::GetSlot()
{
if (strcmp(firstName,"") == 0)
{
return(1);
}
else if (strcmp(secondName, "") == 0)
{
return(2);
}
else
{
return(0);
}
}

void Court::PersonLeaves(char *name)
{
if (strcmp(firstName, name) == 0)
{
strcpy(firstName, "");
count--;
}
else if (strcmp(secondName, name) == 0 )
{
strcpy(secondName, "");
count--;
}
}

int Court::PersonEnters(char *name)
{
int slot;

slot = GetSlot();

if (slot == 1)
{
strcpy(firstName, name);
count++;
return(1);
}
else if (slot == 2)
{
strcpy(secondName, name);
count++;
return(1);
}
else
{
return(0);
}
}

void Court::WhosInFirst(char *buffer)
{
strcpy(buffer, firstName);
}

void Court::WhosInSecond(char *buffer)
{
strcpy(buffer, secondName);
}

int Court::CountPeople()
{
return(count);
}

void main()
{

Court *Original;

//we need a buffer for when we get the names,
char *buffer;
buffer = new char[50];

cout << "Initializing Original with parameters" << endl;
Original = new Court;


cout << "Adding some names!" << endl;
Original->PersonEnters("Scott");
cout << "Number of people in Original = ";
cout << Original->CountPeople() << endl;
Original->PersonEnters("IRD");
cout << "Number of people in Original = ";
cout << Original->CountPeople() << endl;

cout << endl << "Listing People" << endl;
Original->WhosInFirst(buffer);
cout << "First has " << buffer << endl;
Original->WhosInSecond(buffer);
cout << "Second has " << buffer << endl;

cout << endl << "Removing some people" << endl;
Original->PersonLeaves("Scott");
cout << "Number of people = ";
cout << Original->CountPeople() << endl;
cout << endl << "Remove someone not there" << endl;
Original->PersonLeaves("Jhon");
cout << "Number of people in Original = ";
cout << Original->CountPeople() << endl;

//clean up
cout << endl << "Clean up" << endl;
delete Original;

}



Tout allait bien jusqu'a ce que j'arrive a "Court *Original;".
Pourquoi l'auteur utilise un pointeur, il aurait pu juste cree l'object "Court Original;"?

C'est quoi les avantage(s) d'utiliser un pointeur?
C'est quoi les desavantage(s) de ne pas utiliser un pointeur?

Merci d'avance
jeudi 27 mars 2003 à 07:27:14 | Re : Question sur les pointeurs

xgo





-------------------------------
Réponse au message :
-------------------------------

> Voici un programme tiree de "Simple C++"
>
>

>
> #include <string.h>
> #include <iostream.h>
>
> class Court
> {
> private:
> //attributes
> char *firstName;
> char *secondName;
> int count;
>
> //private methods
> int GetSlot();
> public:
> //constructors & destructors
> Court();
> Court(char *first, char *second);
> ~Court();
>
> // Changing information
> int PersonEnters(char *name);
> void PersonLeaves(char *name);
>
> //getting information
> void WhosInFirst(char *buffer);
> void WhosInSecond(char *buffer);
> int CountPeople();
>
> };
>
> Court::Court()
> {
> firstName = new char[50];
> secondName = new char[50];
> strcpy(firstName, "");
> strcpy(secondName, "");
> count = 0;
> }
>
> Court::Court(char *first, char *second)
> {
> firstName = new char[50];
> secondName = new char[50];
> strcpy(firstName, first);
> strcpy(secondName, second);
> count = 2;
> }
>
> Court::~Court()
> {
> delete firstName;
> delete secondName;
> }
>
> int Court::GetSlot()
> {
> if (strcmp(firstName,"") == 0)
> {
> return(1);
> }
> else if (strcmp(secondName, "") == 0)
> {
> return(2);
> }
> else
> {
> return(0);
> }
> }
>
> void Court::PersonLeaves(char *name)
> {
> if (strcmp(firstName, name) == 0)
> {
> strcpy(firstName, "");
> count--;
> }
> else if (strcmp(secondName, name) == 0 )
> {
> strcpy(secondName, "");
> count--;
> }
> }
>
> int Court::PersonEnters(char *name)
> {
> int slot;
>
> slot = GetSlot();
>
> if (slot == 1)
> {
> strcpy(firstName, name);
> count++;
> return(1);
> }
> else if (slot == 2)
> {
> strcpy(secondName, name);
> count++;
> return(1);
> }
> else
> {
> return(0);
> }
> }
>
> void Court::WhosInFirst(char *buffer)
> {
> strcpy(buffer, firstName);
> }
>
> void Court::WhosInSecond(char *buffer)
> {
> strcpy(buffer, secondName);
> }
>
> int Court::CountPeople()
> {
> return(count);
> }
>
> void main()
> {
>
> Court *Original;
>
> //we need a buffer for when we get the names,
> char *buffer;
> buffer = new char[50];
>
> cout << "Initializing Original with parameters" << endl;
> Original = new Court;
>
>
> cout << "Adding some names!" << endl;
> Original->PersonEnters("Scott");
> cout << "Number of people in Original = ";
> cout << Original->CountPeople() << endl;
> Original->PersonEnters("IRD");
> cout << "Number of people in Original = ";
> cout << Original->CountPeople() << endl;
>
> cout << endl << "Listing People" << endl;
> Original->WhosInFirst(buffer);
> cout << "First has " << buffer << endl;
> Original->WhosInSecond(buffer);
> cout << "Second has " << buffer << endl;
>
> cout << endl << "Removing some people" << endl;
> Original->PersonLeaves("Scott");
> cout << "Number of people = ";
> cout << Original->CountPeople() << endl;
> cout << endl << "Remove someone not there" << endl;
> Original->PersonLeaves("Jhon");
> cout << "Number of people in Original = ";
> cout << Original->CountPeople() << endl;
>
> //clean up
> cout << endl << "Clean up" << endl;
> delete Original;
>
> }
>
>

>
> Tout allait bien jusqu'a ce que j'arrive a "Court *Original;".
> Pourquoi l'auteur utilise un pointeur, il aurait pu juste cree l'object "Court Original;"?
>
> C'est quoi les avantage(s) d'utiliser un pointeur?
> C'est quoi les desavantage(s) de ne pas utiliser un pointeur?
>
> Merci d'avance
jeudi 27 mars 2003 à 17:12:41 | Re : Question sur les pointeurs

vieuxLion

salut

je ne connais pas ce "SimpleC++" mais ...
l'utilisation du pointeur sur Court ne se justifie pas ici.
Il est "PlusSimpleC++" de faire une allocation Automatique
Court court;

par contre l'utilisation de pointeurs pour firstName et lastName se justifié car on ne connait par au moment de la compilation les tailles des noms et prénoms. L'allocation Dynamique est alors nécessaire

ATTENTION : car elle est "PusCompliquéeC++" à manipuler
Preuve en est, l'ERREUR commise par l'auteur qui ne libère pas proprement la mémoire
pour être tout à fait correct :
delete [] firstName; firstName=0;

je n'ai pas regardé le reste...

-------------------------------
Réponse au message :
-------------------------------

>
>
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > Voici un programme tiree de "Simple C++"
> >
> >

> >
> > #include <string.h>
> > #include <iostream.h>
> >
> > class Court
> > {
> > private:
> > //attributes
> > char *firstName;
> > char *secondName;
> > int count;
> >
> > //private methods
> > int GetSlot();
> > public:
> > //constructors & destructors
> > Court();
> > Court(char *first, char *second);
> > ~Court();
> >
> > // Changing information
> > int PersonEnters(char *name);
> > void PersonLeaves(char *name);
> >
> > //getting information
> > void WhosInFirst(char *buffer);
> > void WhosInSecond(char *buffer);
> > int CountPeople();
> >
> > };
> >
> > Court::Court()
> > {
> > firstName = new char[50];
> > secondName = new char[50];
> > strcpy(firstName, "");
> > strcpy(secondName, "");
> > count = 0;
> > }
> >
> > Court::Court(char *first, char *second)
> > {
> > firstName = new char[50];
> > secondName = new char[50];
> > strcpy(firstName, first);
> > strcpy(secondName, second);
> > count = 2;
> > }
> >
> > Court::~Court()
> > {
> > delete firstName;
> > delete secondName;
> > }
> >
> > int Court::GetSlot()
> > {
> > if (strcmp(firstName,"") == 0)
> > {
> > return(1);
> > }
> > else if (strcmp(secondName, "") == 0)
> > {
> > return(2);
> > }
> > else
> > {
> > return(0);
> > }
> > }
> >
> > void Court::PersonLeaves(char *name)
> > {
> > if (strcmp(firstName, name) == 0)
> > {
> > strcpy(firstName, "");
> > count--;
> > }
> > else if (strcmp(secondName, name) == 0 )
> > {
> > strcpy(secondName, "");
> > count--;
> > }
> > }
> >
> > int Court::PersonEnters(char *name)
> > {
> > int slot;
> >
> > slot = GetSlot();
> >
> > if (slot == 1)
> > {
> > strcpy(firstName, name);
> > count++;
> > return(1);
> > }
> > else if (slot == 2)
> > {
> > strcpy(secondName, name);
> > count++;
> > return(1);
> > }
> > else
> > {
> > return(0);
> > }
> > }
> >
> > void Court::WhosInFirst(char *buffer)
> > {
> > strcpy(buffer, firstName);
> > }
> >
> > void Court::WhosInSecond(char *buffer)
> > {
> > strcpy(buffer, secondName);
> > }
> >
> > int Court::CountPeople()
> > {
> > return(count);
> > }
> >
> > void main()
> > {
> >
> > Court *Original;
> >
> > //we need a buffer for when we get the names,
> > char *buffer;
> > buffer = new char[50];
> >
> > cout << "Initializing Original with parameters" << endl;
> > Original = new Court;
> >
> >
> > cout << "Adding some names!" << endl;
> > Original->PersonEnters("Scott");
> > cout << "Number of people in Original = ";
> > cout << Original->CountPeople() << endl;
> > Original->PersonEnters("IRD");
> > cout << "Number of people in Original = ";
> > cout << Original->CountPeople() << endl;
> >
> > cout << endl << "Listing People" << endl;
> > Original->WhosInFirst(buffer);
> > cout << "First has " << buffer << endl;
> > Original->WhosInSecond(buffer);
> > cout << "Second has " << buffer << endl;
> >
> > cout << endl << "Removing some people" << endl;
> > Original->PersonLeaves("Scott");
> > cout << "Number of people = ";
> > cout << Original->CountPeople() << endl;
> > cout << endl << "Remove someone not there" << endl;
> > Original->PersonLeaves("Jhon");
> > cout << "Number of people in Original = ";
> > cout << Original->CountPeople() << endl;
> >
> > //clean up
> > cout << endl << "Clean up" << endl;
> > delete Original;
> >
> > }
> >
> >

> >
> > Tout allait bien jusqu'a ce que j'arrive a "Court *Original;".
> > Pourquoi l'auteur utilise un pointeur, il aurait pu juste cree l'object "Court Original;"?
> >
> > C'est quoi les avantage(s) d'utiliser un pointeur?
> > C'est quoi les desavantage(s) de ne pas utiliser un pointeur?
> >
> > Merci d'avance
>
jeudi 27 mars 2003 à 17:21:43 | Re : Question sur les pointeurs

vieuxLion

ouais... enfin en y regardant une seconde fois,
l'utilisation du new ne se justifie pas non plus si l'on bloque la taille à 50 octets
new char[50] aurait pû être remplacé par
char firstName[50];
cela aurait permis de ne pas avoir de destructeur

D'autre part, la classe n'est pas "canonique" car elle ne redéfinit pas le Constructeur de copie ni l'opérateur d'affectation
Pas canonique signifie qu'elle explose si on l'utilise ainsi
Court c2 = c1; // trap au moment ou les destructeurs sont exécutés
décidément, cet exemple est vraiment plus que bizarre
IL EST NUL


-------------------------------
Réponse au message :
-------------------------------

> salut
>
> je ne connais pas ce "SimpleC++" mais ...
> l'utilisation du pointeur sur Court ne se justifie pas ici.
> Il est "PlusSimpleC++" de faire une allocation Automatique
> Court court;
>
> par contre l'utilisation de pointeurs pour firstName et lastName se justifié car on ne connait par au moment de la compilation les tailles des noms et prénoms. L'allocation Dynamique est alors nécessaire
>
> ATTENTION : car elle est "PusCompliquéeC++" à manipuler
> Preuve en est, l'ERREUR commise par l'auteur qui ne libère pas proprement la mémoire
> pour être tout à fait correct :
> delete [] firstName; firstName=0;
>
> je n'ai pas regardé le reste...
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> >
> >
> >
> >
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
> > > Voici un programme tiree de "Simple C++"
> > >
> > >

> > >
> > > #include <string.h>
> > > #include <iostream.h>
> > >
> > > class Court
> > > {
> > > private:
> > > //attributes
> > > char *firstName;
> > > char *secondName;
> > > int count;
> > >
> > > //private methods
> > > int GetSlot();
> > > public:
> > > //constructors & destructors
> > > Court();
> > > Court(char *first, char *second);
> > > ~Court();
> > >
> > > // Changing information
> > > int PersonEnters(char *name);
> > > void PersonLeaves(char *name);
> > >
> > > //getting information
> > > void WhosInFirst(char *buffer);
> > > void WhosInSecond(char *buffer);
> > > int CountPeople();
> > >
> > > };
> > >
> > > Court::Court()
> > > {
> > > firstName = new char[50];
> > > secondName = new char[50];
> > > strcpy(firstName, "");
> > > strcpy(secondName, "");
> > > count = 0;
> > > }
> > >
> > > Court::Court(char *first, char *second)
> > > {
> > > firstName = new char[50];
> > > secondName = new char[50];
> > > strcpy(firstName, first);
> > > strcpy(secondName, second);
> > > count = 2;
> > > }
> > >
> > > Court::~Court()
> > > {
> > > delete firstName;
> > > delete secondName;
> > > }
> > >
> > > int Court::GetSlot()
> > > {
> > > if (strcmp(firstName,"") == 0)
> > > {
> > > return(1);
> > > }
> > > else if (strcmp(secondName, "") == 0)
> > > {
> > > return(2);
> > > }
> > > else
> > > {
> > > return(0);
> > > }
> > > }
> > >
> > > void Court::PersonLeaves(char *name)
> > > {
> > > if (strcmp(firstName, name) == 0)
> > > {
> > > strcpy(firstName, "");
> > > count--;
> > > }
> > > else if (strcmp(secondName, name) == 0 )
> > > {
> > > strcpy(secondName, "");
> > > count--;
> > > }
> > > }
> > >
> > > int Court::PersonEnters(char *name)
> > > {
> > > int slot;
> > >
> > > slot = GetSlot();
> > >
> > > if (slot == 1)
> > > {
> > > strcpy(firstName, name);
> > > count++;
> > > return(1);
> > > }
> > > else if (slot == 2)
> > > {
> > > strcpy(secondName, name);
> > > count++;
> > > return(1);
> > > }
> > > else
> > > {
> > > return(0);
> > > }
> > > }
> > >
> > > void Court::WhosInFirst(char *buffer)
> > > {
> > > strcpy(buffer, firstName);
> > > }
> > >
> > > void Court::WhosInSecond(char *buffer)
> > > {
> > > strcpy(buffer, secondName);
> > > }
> > >
> > > int Court::CountPeople()
> > > {
> > > return(count);
> > > }
> > >
> > > void main()
> > > {
> > >
> > > Court *Original;
> > >
> > > //we need a buffer for when we get the names,
> > > char *buffer;
> > > buffer = new char[50];
> > >
> > > cout << "Initializing Original with parameters" << endl;
> > > Original = new Court;
> > >
> > >
> > > cout << "Adding some names!" << endl;
> > > Original->PersonEnters("Scott");
> > > cout << "Number of people in Original = ";
> > > cout << Original->CountPeople() << endl;
> > > Original->PersonEnters("IRD");
> > > cout << "Number of people in Original = ";
> > > cout << Original->CountPeople() << endl;
> > >
> > > cout << endl << "Listing People" << endl;
> > > Original->WhosInFirst(buffer);
> > > cout << "First has " << buffer << endl;
> > > Original->WhosInSecond(buffer);
> > > cout << "Second has " << buffer << endl;
> > >
> > > cout << endl << "Removing some people" << endl;
> > > Original->PersonLeaves("Scott");
> > > cout << "Number of people = ";
> > > cout << Original->CountPeople() << endl;
> > > cout << endl << "Remove someone not there" << endl;
> > > Original->PersonLeaves("Jhon");
> > > cout << "Number of people in Original = ";
> > > cout << Original->CountPeople() << endl;
> > >
> > > //clean up
> > > cout << endl << "Clean up" << endl;
> > > delete Original;
> > >
> > > }
> > >
> > >

> > >
> > > Tout allait bien jusqu'a ce que j'arrive a "Court *Original;".
> > > Pourquoi l'auteur utilise un pointeur, il aurait pu juste cree l'object "Court Original;"?
> > >
> > > C'est quoi les avantage(s) d'utiliser un pointeur?
> > > C'est quoi les desavantage(s) de ne pas utiliser un pointeur?
> > >
> > > Merci d'avance
> >
>
vendredi 28 mars 2003 à 03:17:48 | Re : Question sur les pointeurs

Darkneon

aha, "vraiment plus que bizarre"

Bon, revenons au choses serieuses.

1. Merci vieuxLion!

2. "Simple C++": un livre qui a ete ecrit en '94

3. Peut-etre qu'il declare Original comme pointeur car il ne connait pas le paramaitre au
debut?

Sinon, c'est un choix personel, ce ca?

4. Est ce que on peut remplacer
firstName = new char[50];
par
firstName = new char[strlen(first)];"?

Si oui, disons qu'on change le nom en cours de route,
le premier nom est strcpy(firstName, "darkneon")
le deuxieme est strcpy(firstName, "vieuxLion")

Etant donne que le deuxieme est
plus long, il faut redefinir la taille de firstName.
Ce qui me viens en tete ce de faire ceci


delete [] firstName; firstName = 0;
firstName = new char[strlen(first)];


Est-ce la bonne facon (je doute), ou on peut modifier la taille de firstName sans etre oubliger de la souprimer de la memoire?

5. Comment on voit qu'une class est canonique?
Que faut t-il faire pour rendre Court canonique?

Merci



-------------------------------
Réponse au message :
-------------------------------

> ouais... enfin en y regardant une seconde fois,
> l'utilisation du new ne se justifie pas non plus si l'on bloque la taille à 50 octets
> new char[50] aurait pû être remplacé par
> char firstName[50];
> cela aurait permis de ne pas avoir de destructeur
>
> D'autre part, la classe n'est pas "canonique" car elle ne redéfinit pas le Constructeur de copie ni l'opérateur d'affectation
> Pas canonique signifie qu'elle explose si on l'utilise ainsi
> Court c2 = c1; // trap au moment ou les destructeurs sont exécutés
> décidément, cet exemple est vraiment plus que bizarre
> IL EST NUL
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > salut
> >
> > je ne connais pas ce "SimpleC++" mais ...
> > l'utilisation du pointeur sur Court ne se justifie pas ici.
> > Il est "PlusSimpleC++" de faire une allocation Automatique
> > Court court;
> >
> > par contre l'utilisation de pointeurs pour firstName et lastName se justifié car on ne connait par au moment de la compilation les tailles des noms et prénoms. L'allocation Dynamique est alors nécessaire
> >
> > ATTENTION : car elle est "PusCompliquéeC++" à manipuler
> > Preuve en est, l'ERREUR commise par l'auteur qui ne libère pas proprement la mémoire
> > pour être tout à fait correct :
> > delete [] firstName; firstName=0;
> >
> > je n'ai pas regardé le reste...
> >
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
> > >
> > >
> > >
> > >
> > > -------------------------------
> > > Réponse au message :
> > > -------------------------------
> > >
> > > > Voici un programme tiree de "Simple C++"
> > > >
> > > >

> > > >
> > > > #include <string.h>
> > > > #include <iostream.h>
> > > >
> > > > class Court
> > > > {
> > > > private:
> > > > //attributes
> > > > char *firstName;
> > > > char *secondName;
> > > > int count;
> > > >
> > > > //private methods
> > > > int GetSlot();
> > > > public:
> > > > //constructors & destructors
> > > > Court();
> > > > Court(char *first, char *second);
> > > > ~Court();
> > > >
> > > > // Changing information
> > > > int PersonEnters(char *name);
> > > > void PersonLeaves(char *name);
> > > >
> > > > //getting information
> > > > void WhosInFirst(char *buffer);
> > > > void WhosInSecond(char *buffer);
> > > > int CountPeople();
> > > >
> > > > };
> > > >
> > > > Court::Court()
> > > > {
> > > > firstName = new char[50];
> > > > secondName = new char[50];
> > > > strcpy(firstName, "");
> > > > strcpy(secondName, "");
> > > > count = 0;
> > > > }
> > > >
> > > > Court::Court(char *first, char *second)
> > > > {
> > > > firstName = new char[50];
> > > > secondName = new char[50];
> > > > strcpy(firstName, first);
> > > > strcpy(secondName, second);
> > > > count = 2;
> > > > }
> > > >
> > > > Court::~Court()
> > > > {
> > > > delete firstName;
> > > > delete secondName;
> > > > }
> > > >
> > > > int Court::GetSlot()
> > > > {
> > > > if (strcmp(firstName,"") == 0)
> > > > {
> > > > return(1);
> > > > }
> > > > else if (strcmp(secondName, "") == 0)
> > > > {
> > > > return(2);
> > > > }
> > > > else
> > > > {
> > > > return(0);
> > > > }
> > > > }
> > > >
> > > > void Court::PersonLeaves(char *name)
> > > > {
> > > > if (strcmp(firstName, name) == 0)
> > > > {
> > > > strcpy(firstName, "");
> > > > count--;
> > > > }
> > > > else if (strcmp(secondName, name) == 0 )
> > > > {
> > > > strcpy(secondName, "");
> > > > count--;
> > > > }
> > > > }
> > > >
> > > > int Court::PersonEnters(char *name)
> > > > {
> > > > int slot;
> > > >
> > > > slot = GetSlot();
> > > >
> > > > if (slot == 1)
> > > > {
> > > > strcpy(firstName, name);
> > > > count++;
> > > > return(1);
> > > > }
> > > > else if (slot == 2)
> > > > {
> > > > strcpy(secondName, name);
> > > > count++;
> > > > return(1);
> > > > }
> > > > else
> > > > {
> > > > return(0);
> > > > }
> > > > }
> > > >
> > > > void Court::WhosInFirst(char *buffer)
> > > > {
> > > > strcpy(buffer, firstName);
> > > > }
> > > >
> > > > void Court::WhosInSecond(char *buffer)
> > > > {
> > > > strcpy(buffer, secondName);
> > > > }
> > > >
> > > > int Court::CountPeople()
> > > > {
> > > > return(count);
> > > > }
> > > >
> > > > void main()
> > > > {
> > > >
> > > > Court *Original;
> > > >
> > > > //we need a buffer for when we get the names,
> > > > char *buffer;
> > > > buffer = new char[50];
> > > >
> > > > cout << "Initializing Original with parameters" << endl;
> > > > Original = new Court;
> > > >
> > > >
> > > > cout << "Adding some names!" << endl;
> > > > Original->PersonEnters("Scott");
> > > > cout << "Number of people in Original = ";
> > > > cout << Original->CountPeople() << endl;
> > > > Original->PersonEnters("IRD");
> > > > cout << "Number of people in Original = ";
> > > > cout << Original->CountPeople() << endl;
> > > >
> > > > cout << endl << "Listing People" << endl;
> > > > Original->WhosInFirst(buffer);
> > > > cout << "First has " << buffer << endl;
> > > > Original->WhosInSecond(buffer);
> > > > cout << "Second has " << buffer << endl;
> > > >
> > > > cout << endl << "Removing some people" << endl;
> > > > Original->PersonLeaves("Scott");
> > > > cout << "Number of people = ";
> > > > cout << Original->CountPeople() << endl;
> > > > cout << endl << "Remove someone not there" << endl;
> > > > Original->PersonLeaves("Jhon");
> > > > cout << "Number of people in Original = ";
> > > > cout << Original->CountPeople() << endl;
> > > >
> > > > //clean up
> > > > cout << endl << "Clean up" << endl;
> > > > delete Original;
> > > >
> > > > }
> > > >
> > > >

> > > >
> > > > Tout allait bien jusqu'a ce que j'arrive a "Court *Original;".
> > > > Pourquoi l'auteur utilise un pointeur, il aurait pu juste cree l'object "Court Original;"?
> > > >
> > > > C'est quoi les avantage(s) d'utiliser un pointeur?
> > > > C'est quoi les desavantage(s) de ne pas utiliser un pointeur?
> > > >
> > > > Merci d'avance
> > >
> >
>
vendredi 28 mars 2003 à 14:12:28 | Re : Question sur les pointeurs

vieuxLion

bonjour,

je croyais avoir d"posé une source expliquant la canonicité d'une classe... mais ce n'est pas le cas
Je vais donc le faire ce week-end.

en ce qui concerne tes remarques/questions

-------------------------------
Réponse au message :
-------------------------------

> aha, "vraiment plus que bizarre"
>
> Bon, revenons au choses serieuses.
>
> 1. Merci vieuxLion!
pas de quoi

> 2. "Simple C++": un livre qui a ete ecrit en '94
ok

> 3. Peut-etre qu'il declare Original comme pointeur car il ne connait pas le paramaitre au
> debut?
>
> Sinon, c'est un choix personel, ce ca?
Utiliser l'alloc dynamique est une possibilité... mais qui devrait répondre à un besoin... car plus risqué à utiliser
et dans le cas présent, il n'y a pas ce besoin

> 4. Est ce que on peut remplacer
> firstName = new char[50];
> par
> firstName = new char[strlen(first)];"?
non, pas tout à fait mais, si first contient ta chaine nom :
firstName = new char[strlen(first)+1];"?
Attention au \0 de fin de chaîne !

> Si oui, disons qu'on change le nom en cours de route,
> le premier nom est strcpy(firstName, "darkneon")
> le deuxieme est strcpy(firstName, "vieuxLion")
>
> Etant donne que le deuxieme est
> plus long, il faut redefinir la taille de firstName.
> Ce qui me viens en tete ce de faire ceci
>
>

> delete [] firstName; firstName = 0;
> firstName = new char[strlen(first)];
>

>
> Est-ce la bonne facon (je doute), ou on peut modifier la taille de firstName sans etre oubliger de la souprimer de la memoire?
OUI c'est la bonne façon de faire (avec +1)
EXCELLENTE l'idée d'optimiser les allocations, il suffit pour cela de ne pas détruire/réallouer si la nouvelle taille est inférieurs à la taille allouée

> 5. Comment on voit qu'une class est canonique?
> Que faut t-il faire pour rendre Court canonique?
Je t'enverrai un message lors de la publication de ma source sur les Classes Canoniques
> Merci
>
vendredi 28 mars 2003 à 21:48:06 | Re : Question sur les pointeurs

Darkneon

Une autre question m'est venu a la tete

si on a

char firstName[50];


est qu'il est possible de changer la taille au milieu du programme?

un peu comme avec "Redim" en BASIC
samedi 29 mars 2003 à 09:57:33 | Re : Question sur les pointeurs

vieuxLion

si tu écris char firstName[50];
le compilateur génère du code assembleur dans lequel 50 (+1) octets sont réservés.
Il est impossible de modifier cette taille (il faudrait modifier l'exécutable pendant l'exécution).
La façon de faire de l'alloc dynamique est l'utilisation du 'new'
(ou de sa version 'C' malloc)
Alors on peut faire se que l'on veut :
exemple delete/new (ou realloc)

-------------------------------
Réponse au message :
-------------------------------

> Une autre question m'est venu a la tete
>
> si on a
>

> char firstName[50];
>

>
> est qu'il est possible de changer la taille au milieu du programme?
>
> un peu comme avec "Redim" en BASIC


Cette discussion est classée dans : buffer, char, court, firstname, secondname


Répondre à ce message

Sujets en rapport avec ce message

mon prog plante [ par lcampeur ] Voilà, j'ai un programme qui consiste a envoyer des fichiers quelconques sur des postes référencés précedemment. Je dois pouvoir envoyé plusieurs fich mon prog plante :-( [ par lcampeur ] Voilà, j'ai un programme qui consiste a envoyer des fichiers quelconques sur des postes référencés précedemment. Je dois pouvoir envoyé plusieurs fich taille chaine de char [ par langedechu ] Salut , voila mon prob (je sais plus comment faire) :j'ai une variable : const char *buffer; et j aimerais savoir le nombre de caractere stocker dans Pb vector de vector de char ! [ par nicolas66 ] Ben g un pti pb avec ce prog en Cpp, à la compile ca passe mé à l'execution ca plante !! si vous savé pk merci d'avance !(c censé initialisé un buffer recv() et du brol [ par epoc ] hum... encore moi!g un petit prob avec la fonction recv() ou send(), je c pas trop.dans mon client j'ai ça :char *buffer = new char[1024];buffer="NEW Fuite de mémoire pas bien mechante mais suante [ par Trollien ] Bonjour,j'approfondi mais diverses connaissances en c++ et je suis tombé sur un phénomène bien connu et plutôt génant dans une application temps réel. SVP besoin d'aide [ par seito ] [size=5] seito [/size]j'ai déveloper une apploication pour transferer des fichiersla reception est parfaite pourtant à l'envoie ça me cause des tas de Buffer sécurisé (pour les pros du C/C++) [ par jockos ] Peux t-on déclarer un buffer sécurisée en C/C++ ?J'entend par buffer sécurisé, un buffer (zone mémoire) alloué réelement en mémoire vive (RAM) et non Comment forcer le RTS pour une liaison RS232 [ par ancat ] Bonjourje viens de faire un petit prog (grandement inspire de sources du site) mais je ne saisis pas trop le controle du RTS.Celui ci est-il traite pa strcat enfin pas tout a fait mais presque [ par yserver ] bonjours tout le monde et merci de lir mon poste merci pour toutes vos reponseEn fait le titres est pas tout a fait bon mais c'etait plsu cours le pb


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,264 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales