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

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

Marsh Posté le 06-06-2001 à 15:26:04    

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
Reply

Marsh Posté le 06-06-2001 à 15:26:04   

Reply

Marsh Posté le 06-06-2001 à 15:39:09    

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".

Reply

Marsh Posté le 06-06-2001 à 15:41:12    

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!!! ;)

Reply

Marsh Posté le 06-06-2001 à 15:43:00    

Le compilo rale ? C'est quoi comme compilo ?

Reply

Marsh Posté le 06-06-2001 à 15:52:27    

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

Reply

Marsh Posté le 06-06-2001 à 15:58:27    

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...

Reply

Marsh Posté le 06-06-2001 à 16:04:31    

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)..

Reply

Marsh Posté le 06-06-2001 à 16:33:27    

Et en version non template, ça passe ?

Reply

Marsh Posté le 06-06-2001 à 16:38:09    

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

Reply

Marsh Posté le 06-06-2001 à 16:44:23    

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.

Reply

Marsh Posté le 06-06-2001 à 16:44:23   

Reply

Marsh Posté le 06-06-2001 à 16:51:36    

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. };

Reply

Marsh Posté le 06-06-2001 à 16:56:55    

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!!

Reply

Marsh Posté le 06-06-2001 à 17:08:15    

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()  
{   }

Reply

Marsh Posté le 06-06-2001 à 17:19:00    

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);
}

Reply

Marsh Posté le 07-06-2001 à 11:07:45    

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???

Reply

Marsh Posté le 07-06-2001 à 11:11:15    

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

Reply

Marsh Posté le 07-06-2001 à 11:38:34    

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]

Reply

Marsh Posté le 07-06-2001 à 11:58:02    

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...

Reply

Marsh Posté le 07-06-2001 à 12:06:55    

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++?? :(

Reply

Marsh Posté le 07-06-2001 à 12:09:31    

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.

Reply

Marsh Posté le 07-06-2001 à 12:11:40    

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.

Reply

Marsh Posté le 07-06-2001 à 12:13:26    

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:

Reply

Marsh Posté le 07-06-2001 à 12:27:42    

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!!).. :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed