C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

constructeurs, et autres, privés

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Manuel Leclerc
Guest





PostPosted: Fri Nov 17, 2006 11:53 pm    Post subject: constructeurs, et autres, privés Reply with quote



Si je déclare un constructeur par défaut privé, ainsi que
copie et affectation, genre

class A {
public:
char * m_p;
A( char * p ) : m_p( p ) {};
private:
A();
A( const A& );
A& operator=( const A& );
};

et que en plus, je n'implémente pas les 3 fonctions privées,
est-ce que je suis bien certain qu'il n'y a aucun moyen
que je me retrouve a exécuter du code dans lequel le
membre m_p serait non initialisé ?
Ou bien est-ce que le compilateur est quand même capable
de construire dans mon dos des objets de la classe A sans
passer par A::A( char * p ) ?
Back to top
Sylvain
Guest





PostPosted: Sat Nov 18, 2006 2:33 am    Post subject: Re: constructeurs, et autres, privés Reply with quote



Manuel Leclerc wrote on 17/11/2006 18:53:
Quote:

Ou bien est-ce que le compilateur est quand même capable
de construire dans mon dos des objets de la classe A sans
passer par A::A( char * p ) ?

non, il passera nécessairement par cet unique constructeur, mais
celui-ci peut être appelé avec un p==NULL, si votre souhait est de
pouvoir tjrs accéder à la donnée pointée sans test préalable, c'est raté.

Sylvain.
Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Nov 18, 2006 2:55 am    Post subject: Re: constructeurs, et autres, privés Reply with quote



On 17 Nov 2006 09:53:38 -0800, "Manuel Leclerc"
<manuel.leclerc (AT) alussinan (DOT) org>:

Quote:
private:
A();

Celui-là n'est pas utile, si je ne m'abuse.

Quote:
est-ce que je suis bien certain qu'il n'y a aucun moyen
que je me retrouve a exécuter du code dans lequel le
membre m_p serait non initialisé ?

Si le code utilisateur ne fait pas de trucs vraiment louche, du style
A* ptr_a_bidon= reinterpret_cast<A*> (malloc (256));

alors tu es effectivement certain que le membre m_p sera initialisé
avec la valeur p (qui peut être NULL).
Mais comme il est public, il ne le restera pas forcément !

Exemple de code bien méchant :

A a (NULL);
char* ptr;
a.m_p= ptr;


Enfin bon, AMHA, tu joues avec le feu.
D'une manière générale, il y a deux types de classes :

- les "struct" à la C, n'ayant que des variables membres publiques, et
éventuellement quelques fonctions "helpers" :

struct C
{
int n;
double x;
double CarreDeX() const { return x*x; }
C();
};

- les classes proprement dites, dans lesquelles toutes les variables
membres sont privées.

class C2
{
public:
// Des fonctions
protected:
// Des fonctions
private:
// Des fonctions et des variables
};
Back to top
Manuel Leclerc
Guest





PostPosted: Sat Nov 18, 2006 3:30 am    Post subject: Re: constructeurs, et autres, privés Reply with quote

Fabien LE LEZ a écrit :

Quote:
Manuel Leclerc:

private:
A();

Celui-là n'est pas utile, si je ne m'abuse.

Bon je viens de faire quelques tests, et effectivement
on dirait que ça revient au même en l'ommetant.

Quote:
est-ce que je suis bien certain qu'il n'y a aucun moyen
que je me retrouve a exécuter du code dans lequel le
membre m_p serait non initialisé ?

Si le code utilisateur ne fait pas de trucs vraiment louche, du
style A* ptr_a_bidon= reinterpret_cast<A*> (malloc (256));

alors tu es effectivement certain que le membre m_p sera
initialisé avec la valeur p (qui peut être NULL).
Mais comme il est public, il ne le restera pas forcément !

Exemple de code bien méchant :

A a (NULL);
char* ptr;
a.m_p= ptr;

Oui, ou bien :
A a( (char*)0xdeadbeef );

tant qu'on y est, mais c'est un autre problème...

je cherche juste a ce que la construction
sans fournir le char* soit impossible.

Et je dois dire que je suis un peu étonné.
L'erreur provoquée par
A a;
ou
A * pa = new A[8];
m'est signalée par le linker, pas par le compilateur.
Est-ce que c'est parce que j'utilise un vieux machin
(MSCV 6) ?

--
Code qui fait des warnings == code de porc == deux baffes dans ta gueule
--libcaca Documentation, Coding style, General guidelines
Back to top
Sylvain
Guest





PostPosted: Sat Nov 18, 2006 3:34 am    Post subject: Re: constructeurs, et autres, privés Reply with quote

Manuel Leclerc wrote on 17/11/2006 22:30:
Quote:

Et je dois dire que je suis un peu étonné.
L'erreur provoquée par
A a;
ou
A * pa = new A[8];
m'est signalée par le linker, pas par le compilateur.
Est-ce que c'est parce que j'utilise un vieux machin
(MSCV 6) ?

dans le même src que la définition de la classe ?
sinon un full rebuild ...

Sylvain.
Back to top
Manuel Leclerc
Guest





PostPosted: Sat Nov 18, 2006 3:48 am    Post subject: Re: constructeurs, et autres, privés Reply with quote

Sylvain a écrit :

Quote:
Manuel Leclerc wrote :

Et je dois dire que je suis un peu étonné.
L'erreur provoquée par
A a;
ou
A * pa = new A[8];
m'est signalée par le linker, pas par le compilateur.
Est-ce que c'est parce que j'utilise un vieux machin
(MSCV 6) ?

dans le même src que la définition de la classe ?

J'a merdé grave. En reprenant la "bonne" version
des sources après plein de bidouilles, j'ai bien
une erreur du compilateur :

- cannot access private member declared
(si j'inclus A(); en private dans la déclaration de la classe)

- no appropriate default constructor available
(si j'ommets A(); dans la déclaration de la classe)

--
Minitel : 36 15 Boulet
Police/pompier : 18
7+14 : 21
--ackboo
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Sat Nov 18, 2006 10:11 am    Post subject: Re: constructeurs, et autres, prives Reply with quote

Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:

Quote:
On 17 Nov 2006 09:53:38 -0800, "Manuel Leclerc"
manuel.leclerc (AT) alussinan (DOT) org>:

private:
A();

Celui-là n'est pas utile, si je ne m'abuse.

Tu ne t'abuses pas. Le constructeur par défaut n'est implicitement défini
par le compilateur que si aucun constructeur n'est explicitement défini.

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
Back to top
Fabien Chêne
Guest





PostPosted: Sat Nov 18, 2006 4:28 pm    Post subject: Re: constructeurs, et autres, prives Reply with quote

Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> writes:

Quote:
Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:

On 17 Nov 2006 09:53:38 -0800, "Manuel Leclerc"
manuel.leclerc (AT) alussinan (DOT) org>:

private:
A();

Celui-là n'est pas utile, si je ne m'abuse.

Tu ne t'abuses pas. Le constructeur par défaut n'est implicitement
défini par le compilateur que si aucun constructeur n'est
explicitement défini.
^^^^^^

Je pense que tu as voulu dire « déclaré ».

--
Fab
Back to top
James Kanze
Guest





PostPosted: Sat Nov 18, 2006 4:43 pm    Post subject: Re: constructeurs, et autres, privés Reply with quote

Fabien LE LEZ wrote:
Quote:
On 17 Nov 2006 09:53:38 -0800, "Manuel Leclerc"
manuel.leclerc (AT) alussinan (DOT) org>:

private:
A();

Celui-là n'est pas utile, si je ne m'abuse.

C'est correct. La présence de n'importe quel constructeur
utilisateur (y compris le constructeur de copie) inhibe sa
génération implicite.

Quote:
est-ce que je suis bien certain qu'il n'y a aucun moyen
que je me retrouve a exécuter du code dans lequel le
membre m_p serait non initialisé ?

Si le code utilisateur ne fait pas de trucs vraiment louche, du style
A* ptr_a_bidon= reinterpret_cast<A*> (malloc (256));

alors tu es effectivement certain que le membre m_p sera initialisé
avec la valeur p (qui peut être NULL).
Mais comme il est public, il ne le restera pas forcément !

Exemple de code bien méchant :

A a (NULL);
char* ptr;
a.m_p= ptr;

Ou simplement :

char* ptr ;
A a( ptr ) ;

Il n'y a malheureusement aucune possibilité de s'assurer que
tous les pointeurs soient correctement initialisés.

(Mais ton point concernant les membres publics est juste.)

--
James Kanze (Gabi Software) email: james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Sat Nov 18, 2006 8:58 pm    Post subject: Re: constructeurs, et autres, prives Reply with quote

fabien.chene (AT) gmail (DOT) com (Fabien Chêne) writes:

Quote:
Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> writes:

Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:

On 17 Nov 2006 09:53:38 -0800, "Manuel Leclerc"
manuel.leclerc (AT) alussinan (DOT) org>:

private:
A();

Celui-là n'est pas utile, si je ne m'abuse.

Tu ne t'abuses pas. Le constructeur par défaut n'est implicitement
défini par le compilateur que si aucun constructeur n'est
explicitement défini.
^^^^^^
Je pense que tu as voulu dire « déclaré ».

Oui.

--
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
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.