Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1381 connectés 

  FORUM HardWare.fr
  Programmation

  [C++] Templates et friends ??? HELP!!

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Templates et friends ??? HELP!!

n°37391
H4dd3R
Q2
Posté le 06-06-2001 à 15:26:04  profilanswer
 

Comment définir un friend ds des templates???
 
Exemple:
 
template<class Type> class Child;  
 
template <class Type>
class Mother
{
 friend class Child<Type>;
private:
   Mother();
};
 
Ici j´utilise cette mère:
 
template <class Type>
class Child: public Mother<Type>
{
public:
   Child();
};
 
template <class Type>
Child<Type>::Child()
{   <- Error, peut pas accéder à Mother::Mother() car privé..
}
 
Bouh comment faire???


---------------
Athlon64 s754 10*200MHz - R9800Pro - 512MB DDR200MHz - ZX6RR - Q2[SupOp] - Tutorial Video: multilangues, multisstitres
mood
Publicité
Posté le 06-06-2001 à 15:26:04  profilanswer
 

n°37397
oliv5
Pourquoi ? Parce que !
Posté le 06-06-2001 à 15:39:09  profilanswer
 

peut etre que je te repond a cote de la plaque, mais bon, on va voir.
Si j'ai bien compris child herite de mother. essaie donc de declarer ta methode "protected".

n°37399
H4dd3R
Q2
Posté le 06-06-2001 à 15:41:12  profilanswer
 

Non si j´ai mis Mother::Mother() en private, c bien parce que la classe n´est concue que pour être utilisée par Child.. Les autres classes filles ne doivent en aucun cas avoir le droit d´instancier Mother!!
 
C tt le sens du "friend".. Mais comment le faire marcher sur des templates??? Décoincez moi!!! ;)

n°37401
verdoux
And I'm still waiting
Posté le 06-06-2001 à 15:43:00  profilanswer
 

Le compilo rale ? C'est quoi comme compilo ?

n°37407
H4dd3R
Q2
Posté le 06-06-2001 à 15:52:27  profilanswer
 

C le classique Visual C++ 6.. :(
Normalement il devrait accepter???

n°37408
TheJackal
Posté le 06-06-2001 à 15:58:27  profilanswer
 

j'ai un petit doute mais je me gourre peut etre:
private: ne sont accessible que par la classe qui declare (classe mere, origine) et pas par une des ses derive
 
a verifier...

n°37412
H4dd3R
Q2
Posté le 06-06-2001 à 16:04:31  profilanswer
 

Mes excuses Verdoux, j´avais mal analysé le pb..
Cette fois un copier coller d´un petit test:

template<class Type> class Child;  
 
class Mother
{
 friend class Child<class Type>;
 
 Mother();
};
 
template <class Type>
class Child: public Mother
{
public:
 Child();
};
 
template <class Type>
Child<Type>::Child()
{  
<-- error C2248: 'Mother::Mother' : cannot access private member declared in class 'Mother'
}
 
BOOL CTestTemplateApp::InitInstance()
{
/**/Child<char> C;
 
 return FALSE;
}

 
En fait le template type n´est pas connu de la mère.. Je souhaite qu´elle accepte comme friend la template, qqe soit le type..
 
Ce devrait être possible!! (en tt cas je vois pas de raison contre)..

n°37430
verdoux
And I'm still waiting
Posté le 06-06-2001 à 16:33:27  profilanswer
 

Et en version non template, ça passe ?

n°37433
H4dd3R
Q2
Posté le 06-06-2001 à 16:38:09  profilanswer
 

Oui ds Mother j´arrive à déclarer une classe normale en friend (heureusement!!).. Mais un template comme friend d´une classe normale.. :(

n°37436
janoscoder
Posté le 06-06-2001 à 16:44:23  profilanswer
 

template <class T>
Mother
{
 template <class X>
 friend class Child<X>;
};
 
devrait permettre d'autoriser une amitié plus tolérante. Je n'ai pas essayé car je n'ai pas le temps, mais à voir.
Sinon il faut savoir que le constructeur d'une classe fille, si l'appel au constructeur de la classe mère et des données membres n'est pas explicité, le constructeur par d"faut, lui, est appelé. Le mettre en private, est quand même relativement peu courant.

mood
Publicité
Posté le 06-06-2001 à 16:44:23  profilanswer
 

n°37439
verdoux
And I'm still waiting
Posté le 06-06-2001 à 16:51:36  profilanswer
 

Y a ta classe Mother qui est mal foutue dans le second cas, non ?
Faudrait pas mettre plutôt:

Code :
  1. class Mother
  2. {
  3. template <class Type> friend class Child<Type>;
  4. Mother();
  5. };

n°37445
H4dd3R
Q2
Posté le 06-06-2001 à 16:56:55  profilanswer
 

Pquoi celà Verdoux??
 

template<class Type> class Child;  
 
class Mother
{
 template <class Type> friend class Child<Type>;  
 
 
 Mother();
};

donne error C2059: syntax error : '<end Parse>'
 
et sans la déclaration au début:

// template<class Type> class Child;  
 
class Mother
{
 template <class Type> friend class Child<Type>;  
 
 
 Mother();
};

donne error C2059: syntax error : '<'
 
Oui janoscoder, si mother est elle même une template ça marche (en tt cas avec 2 mêmes types).. Mais je ne le souhaite pas!!

n°37452
verdoux
And I'm still waiting
Posté le 06-06-2001 à 17:08:15  profilanswer
 

janoscoder a écrit a écrit :

template <class T>
Sinon il faut savoir que le constructeur d'une classe fille, si l'appel au constructeur de la classe mère et des données membres n'est pas explicité, le constructeur par d"faut, lui, est appelé. Le mettre en private, est quand même relativement peu courant.




Donc il devrait mettre:
template <class Type>  
Child<Type>::Child():Mother()  
{   }

n°37459
janoscoder
Posté le 06-06-2001 à 17:19:00  profilanswer
 

ce code fonctionne sous gcc.
Par contre si mother est un template, ça fait une erreur interne du compilo...
Mais bon, le code ci dessous est ok
 
template <class T>
class child;
 
class mother
{
  int mit;
  template <class T>
  friend child<T>;
private:
  mother(){}
};
 
template <class T>
class child: public mother
{
  T item;
public:
  child(const T& titem):item(titem){};
};
 
// là la fontion main...
int main(int argc, char ** argv)
{
  child<float> c(3.0);
}

n°37638
H4dd3R
Q2
Posté le 07-06-2001 à 11:07:45  profilanswer
 

Merci les gars, c sympa de se faire si bien aider!!
 
Par contre quelle grosse daube ce VisualC++6!!
 
Ton code janoscoder ne marche pas!!
Il me fait error C2059: syntax error : '<end Parse>' à la ligne friend child<T>;..  :(
 
Qqun sait comment faire marcher le code de janoscoder sous Visual???

n°37643
rufo
Pas me confondre avec Lycos!
Posté le 07-06-2001 à 11:11:15  profilanswer
 

de toute manière, les fonctions amies, c'est anti génie logiciel!!!!!!!!!!! -> c'est pas bien en bref.

n°37656
H4dd3R
Q2
Posté le 07-06-2001 à 11:38:34  profilanswer
 

Je suis pas d´accord avec toi.. Ce qui est important c que ce que tu livre ne puisse pas planter même en étant utilisé de manière incorrecte..
 
Si tu fais un object dangereux, que tu le vérouille comme je l´ai fait avec tous les constructeurs en private, et que tu fais un second objet (le friend) pour l´interfacer cette fois de manière sûre, ben l´ensemble des 2 objets que tu livre est correct!!  Na!! ;)

 

[edit]--Message édité par H4dd3R--[/edit]

n°37665
rufo
Pas me confondre avec Lycos!
Posté le 07-06-2001 à 11:58:02  profilanswer
 

franchement, faire un constructeur en private c'est zarb!!!
un objet bien porgrammé, c'est les constructeurs en public, les attributs en private et pour chaque attribut, une fonction permettant de lire sa valeur une autre permettant de modifier sa valeur (si c'est utile). Pour le reste des autres fonctions effectuant des traitements, certaines doivent être private, d'autres public ou protected...

n°37670
H4dd3R
Q2
Posté le 07-06-2001 à 12:06:55  profilanswer
 

Franchement ton concept est un peu simple..
Les attributs en private, ben seulement si il est dangereux que l´utilisateur les modifie comme ça sans en notifier la classe (mais c loin d´être tjrs le cas)!!
Tt comme un constructeur en private, qc c dangereux que n´importe qui puisse instancier l´objet.. ;)
 
Mais personne qui sache déclarer une template class en friend ss VisualC++?? :(

n°37672
verdoux
And I'm still waiting
Posté le 07-06-2001 à 12:09:31  profilanswer
 

Ce qui peut surprendre, c'est de mettre le constructeur en private (donc ça bloque la dérivation) puis de mettre la classe dérivée en friend.
En fait c'est du polymorphisme controlé, seule la classe dérivée explicité par le friend est utilisable.
 
A noter, qu'au moins jusque récemment, gcc ne tient pas compte des droits d'accès (protected, private) dans les classes templates.

n°37673
verdoux
And I'm still waiting
Posté le 07-06-2001 à 12:11:40  profilanswer
 

H4dd3R a écrit a écrit :

 
Mais personne qui sache déclarer une template class en friend ss VisualC++?? :(




Dans la KBase de MS sur VC++, y a pas mal de bugs recensés sur friend et les templates.
D'ailleurs VC++ a toujours été à la traîne sur le support des templates, je crois.

n°37676
rufo
Pas me confondre avec Lycos!
Posté le 07-06-2001 à 12:13:26  profilanswer
 

H4dd3R a écrit a écrit :

Franchement ton concept est un peu simple..
Les attributs en private, ben seulement si il est dangereux que l´utilisateur les modifie comme ça sans en notifier la classe (mais c loin d´être tjrs le cas)!!
Tt comme un constructeur en private, qc c dangereux que n´importe qui puisse instancier l´objet.. ;)
 
Mais personne qui sache déclarer une template class en friend ss VisualC++?? :(




 
je suis d'accord qu'on peut mettre certains attributs en public ou protected, mais en général, ce que je propose comme "méthode" pour développer un objet propre est la mieux. En tout cas, c'est comme ça que tous mes profs de C++ et génie logiciel m'ont présenté la manière d'implémenter des objets proprement.
:hello:

n°37682
H4dd3R
Q2
Posté le 07-06-2001 à 12:27:42  profilanswer
 

rufo eh bien disons que je ne suis pas d´accord avec tes profs!! ;)
Mais je te rassure mes profs disaient la même chose (faut pas tjrs faire confiance aux profs!!)..  :D  :D  
 
Verdoux ouai tu n´es pas le premier à dire que Visual est à la traine sur les templates.. Bah tant pis je continuerais à programmer moche en attendant Java (ahh enfin être débarassé des adresses!!).. :)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [C++] Templates et friends ??? HELP!!

 

Sujets relatifs
[PHP] HELP !!!!VISUAL BASIC + BASE DE DONNEE NEED HELP
[MySQL] Débutant please help ![ANALYSE][DB SOUS VB] help!
NOVICE... HELP...[ASP] Help pb avec double connexion sur un seul site je craaqqquuee
[C++] help héritage[PL\SQL] Need Help
[HELP] pb de controle de la rapidité d'un(e) thread.HELP
Plus de sujets relatifs à : [C++] Templates et friends ??? HELP!!


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR