OVH Cloud OVH Cloud

Constructeur

7 réponses
Avatar
nico
Bonjour,

Comment appeler le constructeur d'une classe ?

class A
{
public:
A();
~A();
};

A obj;
obj.A() //marche pas
obj.~A() //marche

Merci.

--
nico

7 réponses

Avatar
Andre Heinen
On Thu, 23 Jun 2005 13:34:35 +0200, nico wrote:

Comment appeler le constructeur d'une classe ?


Il est appelé automatiquement lorsque tu crées une instance (mais ça
tu le savais déjà). Il n'est pas possible de l'appeler explicitement.

obj.A() //marche pas


Hé non... Mais au fait, que veux-tu faire?

Si ton but est de passer des arguments au constructeur d'une classe de
base ou d'un membre, procède comme ceci:

class A { // pour faire une base
public:
A(int);
};

class B { // pour faire un membre
public:
B(double);
};

class C: public A {
B b;
public:
C(int i, double d) : A(i), b(d) {}
};

obj.~A() //marche


Attention, appeler explicitement un destructeur est généralement une
erreur. N'oublie pas que le destructeur est appelé automatiquement
lors de la destruction de l'objet.

--
André Heinen
Mon e-mail, encodé ROT13: n qbg urvara ng rhebcrnayvax qbg pbz
La FAQ: http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/

Avatar
nico
Salut,

Il est appelé automatiquement lorsque tu crées une instance (mais ça
tu le savais déjà). Il n'est pas possible de l'appeler explicitement.

obj.A() //marche pas


Hé non... Mais au fait, que veux-tu faire?



En fait c'était pour m'amuser un peu avec la mémoire (je voulais recreer mon
new, donc il me fallait appeller les constructeurs (en partant de la classe
de base etc...)) mais j'ai trouvé qu'on peut surcharger globalement les
opérateurs new et delete donc plus besoin :) Merci quand même.

--
nico


Avatar
Jean-Marc Bourguet
nico writes:

Salut,

Il est appelé automatiquement lorsque tu crées une instance (mais ça
tu le savais déjà). Il n'est pas possible de l'appeler explicitement.

obj.A() //marche pas


Hé non... Mais au fait, que veux-tu faire?



En fait c'était pour m'amuser un peu avec la mémoire (je voulais recreer mon
new, donc il me fallait appeller les constructeurs (en partant de la classe
de base etc...)) mais j'ai trouvé qu'on peut surcharger globalement les
opérateurs new et delete donc plus besoin :) Merci quand même.


Pour ce genre de chose, il y a aussi le new avec placement:

void* rawptr = malloc(sizeof(A));
A* ptr = new (rawptr) A;

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
nico
Jean-Marc Bourguet wrote:

nico writes:

Salut,

Il est appelé automatiquement lorsque tu crées une instance (mais ça
tu le savais déjà). Il n'est pas possible de l'appeler explicitement.

obj.A() //marche pas


Hé non... Mais au fait, que veux-tu faire?



En fait c'était pour m'amuser un peu avec la mémoire (je voulais recreer
mon new, donc il me fallait appeller les constructeurs (en partant de la
classe de base etc...)) mais j'ai trouvé qu'on peut surcharger
globalement les opérateurs new et delete donc plus besoin :) Merci quand
même.


Pour ce genre de chose, il y a aussi le new avec placement:

void* rawptr = malloc(sizeof(A));
A* ptr = new (rawptr) A;


Oui je n'ai vu qu'apres.
Merci.

--
nico




Avatar
nico
nico wrote:

Salut,

Il est appelé automatiquement lorsque tu crées une instance (mais ça
tu le savais déjà). Il n'est pas possible de l'appeler explicitement.

obj.A() //marche pas


Hé non... Mais au fait, que veux-tu faire?



En fait c'était pour m'amuser un peu avec la mémoire (je voulais recreer
mon new, donc il me fallait appeller les constructeurs (en partant de la
classe de base etc...)) mais j'ai trouvé qu'on peut surcharger globalement
les opérateurs new et delete donc plus besoin :) Merci quand même.



J'ai d'ailleurs un probleme :

Soit une classe A (d'une taille de 16o).
Et une classe B de base A (d'une taille de 24o).

A un moment je recupère les données repersentant B par un void*, je veux
désallouer alors pour ca je veux connaitre la taille, je fais sizeof(B) et
là bah j'ai la taille de A...

Est-ce possible de retrouver la taille de B ?

Ou dois-je changer de méthode (je pensais à stocker la taille des blocks
alloués) ?


--
nico



Avatar
nico
nico wrote:

nico wrote:

Salut,

Il est appelé automatiquement lorsque tu crées une instance (mais ça
tu le savais déjà). Il n'est pas possible de l'appeler explicitement.

obj.A() //marche pas


Hé non... Mais au fait, que veux-tu faire?



En fait c'était pour m'amuser un peu avec la mémoire (je voulais recreer
mon new, donc il me fallait appeller les constructeurs (en partant de la
classe de base etc...)) mais j'ai trouvé qu'on peut surcharger
globalement les opérateurs new et delete donc plus besoin :) Merci quand
même.



J'ai d'ailleurs un probleme :

Soit une classe A (d'une taille de 16o).
Et une classe B de base A (d'une taille de 24o).

A un moment je recupère les données repersentant B par un void*, je veux
désallouer alors pour ca je veux connaitre la taille, je fais sizeof(B) et
là bah j'ai la taille de A...

Est-ce possible de retrouver la taille de B ?

Ou dois-je changer de méthode (je pensais à stocker la taille des blocks
alloués) ?


en fait je pense que je vais changer de méthode :)


--
nico




Avatar
Andre Heinen
On Thu, 23 Jun 2005 17:03:29 +0200, nico wrote:

Jean-Marc Bourguet wrote:

Pour ce genre de chose, il y a aussi le new avec placement:

void* rawptr = malloc(sizeof(A));
A* ptr = new (rawptr) A;


Oui je n'ai vu qu'apres.
Merci.


Et, si je ne me trompe (je n'ai pas trop l'habitude de ce genre de
choses), il s'agit justement d'un des rares cas où tu peux avoir
besoin d'appeler un destructeur explicitement. Ne tiens donc pas trop
compte de mon avertissement de tout à l'heure à ce sujet.

Amuse-toi bien ;-)

--
André Heinen
Mon e-mail, encodé ROT13: n qbg urvara ng rhebcrnayvax qbg pbz
La FAQ: http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/