OVH Cloud OVH Cloud

classe et pointeur

6 réponses
Avatar
XecTech
-----

#include <iostream.h>

class int_maillon {
public :
int valeur;
int_maillon *prec, *suiv;
};

void main() {
int_maillon *test;
test = new int_maillon;
std::cout << "--[Test des listes chainées]--" << std::endl;
std::cin >> *test.valeur;
std::cout << *test.valeur;
}

----

Mais je n'arrive pas à accéder à *test.valeur, comment faire ?

6 réponses

Avatar
Philippe Guglielmetti
"XecTech" a écrit:

std::cin >> *test.valeur;
std::cout << *test.valeur;

std::cin >> (*test).valeur; // ou
std::cout << test->valeur;


débutant, hein ? on va pas toujours faire tes devoirs scolaires ;-)
--
Philippe Guglielmetti - www.dynabits.com

Avatar
Marc Boyer
void main() {
int_maillon *test;
test = new int_maillon;
std::cout << "--[Test des listes chainées]--" << std::endl;
std::cin >> *test.valeur;


Problème de priorité des operateurs: ce que tu as
écris est équivalent à
*(test.valeur)
alors que tu voulais surement
(*test).valeur
std::cout << *test.valeur;
}

Mais je n'arrive pas à accéder à *test.valeur, comment faire ?


-> est ton ami.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Keon
Ce que Marc Broyer t'as dit est juste. Mais dans ton main, tu ne donne pas
de valeur au membre valeur, c'est peut-être voulu, enfin, tu peux te passser
de mettre toujours std::cout. Il te suffit en fonction de l'implémentation
du compilateur, soit de mettre #include <iostream> ou #include <iostream.h>
et d'ajouter la ligne using namespace std; juste en-dessous de iostream.
Avatar
Jean-Marc Molina
Bonsoir,

Tu débutes ? Quelle chance tu as de nous avoir sous la main :p (ça pourrait
être pire ^^)

Comme l'a dit Keon, tu devrais initialiser l'attribut valeur de ta classe
int_maillon.

Quelques règles fondamentales :
- ne jamais mettre un attribut en public, toujours en protected/private
(sinon n'importe qui peut affecter n'importe quoi à n'importe quoi, NULL à
tes pointeurs par exemple)
- utiliser un accesseur pour accéder ou modifier les attributs (pseudo
concept d'encapsulation : get_attribut (), set_attribut ())
- toujours initialiser les attributs à l'aide du constructeur, surtout pour
des pointeurs (prec et suiv à NULL). Quand un pointeur est utilisé comme tu
le fais (ce qui peut marcher sous Visual C++ en mode Debug car certains
espaces mémoire sont à ZERO donc NULL), on dit qu'il est fou (le pointeur,
pas toi :p). C'est très grave car certaines applications plantent justement
à cause de ça ! en Debug tout va bien puis en Release, fling flong!
- utiliser l'opérateur -> pour accéder aux éléments pointés par un pointeur
: test->valeur et pas (* test).valeur, ce qui revient à "créer" une
référence (* test) pour accéder à l'élement valeur pointé par le pointeur
test (un peu lourd, non ?)

Au final ta classe pourrait ressembler à ça (en simplifiant, j'en ai déjà
trop dit :p) :
class int_maillon
{
private :
int valeur;
int_maillon *prec, *suiv;
public :
// Une liste d'init serait la bienvenue mais ne compliquons pas les
choses pour le plaisir :p
int_maillon ()
{
valeur = 0;
prec = NULL;
suiv = NULL;
}
int get_valeur () const
{
return (valeur);
}
};

L'implémentation n'est pas importante ce sont les règles et concepts qui le
sont. Je pense à l'utilisation d'une liste d'init pour les attributs ou le
petit const que tu trouves sur la fonction get_valeur (const car on ne
modifie pas un attribut de la classe, on retourne simplement une valeur...),
on aurait pu parler du destructeur mais bon... Déjà si tu initialises bien
tes attributs pour éviter les valeurs ou pointeurs fous, ça sera un grand
pas pour tes phases de déboguage :)

JM

--
Clé AntiPourriel : PASUNPOURRIEL (ne pas retirer)
Avatar
XecTech
Lol, oui, je suis débutant (enfin, là, pas besoin de s'appeler Jean Charles
pour le voir), et non, ce ne sont pas des devoirs, j'aprends juste le C++
par moi-même.

Merci à tous pour vos indications qui m'ont beaucoups appris!

"Philippe Guglielmetti" a écrit dans le message de
news:3f98bacf$0$3675$
"XecTech" a écrit:

std::cin >> *test.valeur;
std::cout << *test.valeur;

std::cin >> (*test).valeur; // ou
std::cout << test->valeur;


débutant, hein ? on va pas toujours faire tes devoirs scolaires ;-)
--
Philippe Guglielmetti - www.dynabits.com





Avatar
Bruno Desthuilliers
XecTech wrote:
(merci de répondre *sous* le post [corrigé])

"Philippe Guglielmetti" a écrit dans le message de
news:3f98bacf$0$3675$


débutant, hein ? on va pas toujours faire tes devoirs scolaires ;-)
Lol, oui, je suis débutant (snip)


Merci à tous pour vos indications qui m'ont beaucoups appris!



Alors apprend aussi à répondre *sous* le post, pas au dessus !-)

Bruno