 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Manuel Leclerc Guest
|
Posted: Fri Nov 17, 2006 11:53 pm Post subject: constructeurs, et autres, privés |
|
|
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
|
Posted: Sat Nov 18, 2006 2:33 am Post subject: Re: constructeurs, et autres, privés |
|
|
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
|
Posted: Sat Nov 18, 2006 2:55 am Post subject: Re: constructeurs, et autres, privés |
|
|
On 17 Nov 2006 09:53:38 -0800, "Manuel Leclerc"
<manuel.leclerc (AT) alussinan (DOT) org>:
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
|
Posted: Sat Nov 18, 2006 3:30 am Post subject: Re: constructeurs, et autres, privés |
|
|
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
|
Posted: Sat Nov 18, 2006 3:34 am Post subject: Re: constructeurs, et autres, privés |
|
|
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
|
Posted: Sat Nov 18, 2006 3:48 am Post subject: Re: constructeurs, et autres, privés |
|
|
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
|
|
| Back to top |
|
 |
Fabien Chêne Guest
|
Posted: Sat Nov 18, 2006 4:28 pm Post subject: Re: constructeurs, et autres, prives |
|
|
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
|
Posted: Sat Nov 18, 2006 4:43 pm Post subject: Re: constructeurs, et autres, privés |
|
|
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
|
Posted: Sat Nov 18, 2006 8:58 pm Post subject: Re: constructeurs, et autres, prives |
|
|
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 |
|
 |
|
|
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
|
|