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

  FORUM HardWare.fr
  Programmation
  Java

  template c++ -> Java

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

template c++ -> Java

n°1708166
nayaphykit
Posté le 26-03-2008 à 15:37:19  profilanswer
 

Bonjour,
 
je suis amenee pour mon projet a traduire des classes c++ en java.
je ne suis pas une pro ni en java ni en c++
 
voila la classe que je dois traduire :
C++

Code :
  1. template <class T>
  2. struct SingletonCreator
  3. {
  4.    SingletonCreator() { T::instance(); }
  5.    inline void dummy() const { ; }
  6. };


 
voila comment je l'ai traduit
java

Code :
  1. public class SingletonCreator<T> {
  2. <T>SingletonCreator() { instance(); }
  3. public void dummy() { ; }
  4. }


 
j'utilise eclipse pour developper et il me souligne instance(); , j'ai essaye de mettre plusieurs trucs dont <T>.instance(); mais je n'arrive pas a trouver la solution
 
j'ai le message d'erreur suivant  

Citation :

The method instance() is undefined for the type SingletonCreator<T>


 
je vous remerci d'avance pour votre aide
 
Naya

mood
Publicité
Posté le 26-03-2008 à 15:37:19  profilanswer
 

n°1713004
Anonymouse
Posté le 04-04-2008 à 23:02:00  profilanswer
 

Bah normal t'as une classe dans laquelle tu appelle une méthode instance() qui n'existe pas.
 
En plus ca ne sert a rien de mettre un ";" dans une méthode ou aucun code n'est écrit.
 
De plus tu n'as pas de constructeur dans ta classe (A part celui hérité d'object).
 
Sinon un lien sur la différence entre template et type generics http://lroux.developpez.com/articl [...] esGenerics
 
Pour le reste je ne comprend pas le C++ donc je ne peux t'être d'une grande aide.

n°1713062
Joel F
Real men use unique_ptr
Posté le 05-04-2008 à 10:19:33  profilanswer
 

Anonymouse a écrit :


De plus tu n'as pas de constructeur dans ta classe (A part celui hérité d'object).


 
Apparemment tune sais pas ce qu'est un singleton non plus  :sarcastic:

n°1713067
Anonymouse
Posté le 05-04-2008 à 10:31:00  profilanswer
 

Joel F a écrit :


 
Apparemment tune sais pas ce qu'est un singleton non plus  :sarcastic:


 
Singleton permet de n'avoir qu'une seul instanciation d'objet.
En quoi ta remarque est pertinente?
 
De plus je ne sais pas comment tu implémente le design pattern singleton mais sans variable static et sans constructeur tu dois avoir une méthode bien spécial pour le faire.
 

Code :
  1. public class SingletonCreator
  2. {
  3. public static SingletonCreator singleton;
  4. private SingletonCreator() {
  5. }
  6. public static SingletonCreator getSingleton()
  7. {
  8.  if(singleton==null)
  9.  {
  10.   singleton=new SingletonCreator();
  11.  }
  12.  return singleton;
  13. }
  14. public static void main(String[] args) {
  15.  SingletonCreator a=SingletonCreator.getSingleton();
  16. }
  17. }


 
Bien entendu l'extrait de code ci-dessus ne respecte pas le design pattern singleton en environnement mono-thread et bien entendu il n'as pas de constructeur !!!


Message édité par Anonymouse le 05-04-2008 à 10:38:23
n°1713071
Joel F
Real men use unique_ptr
Posté le 05-04-2008 à 10:34:57  profilanswer
 

bah, ça me semble logique qu'elle n'ai pas de constructeur public en gros

n°1713075
Anonymouse
Posté le 05-04-2008 à 10:42:10  profilanswer
 

Joel F a écrit :

bah, ça me semble logique qu'elle n'ai pas de constructeur public en gros


 
Bah ouais mais faire une classe sans constructeur même privé de cette façon j'en vois pas l'intérêt.
 
De plus ai-je dit: "tu n'as pas de constructeur public" bah nan j'ai dit qu'elle en avait pas.


Message édité par Anonymouse le 05-04-2008 à 11:59:08
n°1713873
nayaphykit
Posté le 07-04-2008 à 15:58:33  profilanswer
 

dans le code c++ initial il n'y a pas non plus de constructeur etc et ca fonctionne apparement.
 
je ne suis pas forte ni en c++ ni en java et donc je galere.  
je ne vois pas comment faire pour que mon singleton fonctionne

n°1714109
LePhasme
Les Belges domineront le monde
Posté le 08-04-2008 à 08:53:11  profilanswer
 

Comme l'a dit anonymouse il faut que tu déclare une méthode instance


---------------
Instagram - Mon PVT en Australie.
n°1716140
BifaceMcLe​OD
The HighGlandeur
Posté le 11-04-2008 à 11:22:36  profilanswer
 

Si je peux me permettre, tout ceci n'a guère de sens. En fait, ce n'est pas vraiment traduisible en Java. La manière d'écrire les singletons en Java est nettement plus simple qu'en C++ (même multi-thread-safe ; et en l'occurrence, l'écriture est plus simple que ce qu'a écrit Anonymouse). Elle est tellement simple qu'elle rend inutilement complexe toute tentative de factoriser le code de création du singleton.
 
Si on essaie de le faire quand même, voici ce que ça donne, étape par étape, et on verra là où ça va finir par coincer.
 
Le truc fondamental avec les templates C++, c'est que le compilateur pioche dans le code template pour ne compiler que ce dont il a besoin. Si une classe template n'est pas utilisée, il ne la compile pas. Si une classe template utilisée a une de ses méthodes qui n'est pas utilisée, il ne compile pas cette dernière. Et surtout, on peut faire des suppositions sur les types templates (ici, il existe une méthode instance() sur le type T) sans le dire vraiment. On peut donc tout à fait écrire du code template C++ qui ne compile pas (en tout cas pas tout seul), alors même que le compilateur C++ n'affiche aucune erreur à la compilation.
 
En Java, le compilateur compile toujours l'intégralité des classes génériques. Il vérifie donc la syntaxe de tout leur code. Et en plus, il faut impérativement dire ce qu'on suppose sur les types génériques.
 
Ainsi, si on suppose que le type T possède une opération instance(), il faut écrire un truc du genre :

Code :
  1. interface Singleton<T> {
  2.   T instance();
  3. }
  4. class SingletonCreator<T extends Singleton<T>> { ... }


Le problème ensuite pour traduire ton code de C++ en Java, c'est qu'on se retrouve face à une autre limitation des génériques Java : dans la version C++, l'opération instance() sur T est statique ; c'est donc une opération qui porte sur la classe T elle-même, et non une opération qui porte sur une instance de T.
 
En Java, il n'y a aucun moyen d'exprimer une telle chose : les opérations dans les classes génériques ne peuvent être définies que comme des opérations qui portent sur des instances. Et quand on a un type générique T en Java, on ne peut pas non plus écrire "new T()" ou "T.class"
 
Bref, c'est peut-être possible en utilisant les éléments les plus poussés de l'introspection (package java.lang.reflect), mais je ne connais pas vraiment de moyen de factoriser le code de création d'un singleton. En même temps, y a-t-il vraiment besoin de factoriser ceci (qui est thread-safe) ?

Code :
  1. public class MonSingleton {
  2.     private static final MonSingleton instance = new MonSingleton();
  3.     private MonSingleton() {
  4.         ...
  5.     }
  6.     public static MonSingleton getInstance() {
  7.         return instance;
  8.     }
  9. }


Message édité par BifaceMcLeOD le 11-04-2008 à 11:29:30

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

  template c++ -> Java

 

Sujets relatifs
Comment faire programmer un fichier JAR En JAVAfonction matcher connue en PHP mais pas en JAVA
composition des Web services avec javaJava : question affichage JTree
Petit problème trivial avec les tableauxUn bon livre pour la java orienté objet...
[Résolu] Variable non static depuis une méthode static,Php/Java bridgeutilisation de java sur l'embarqué
code source ou de template java pour la gestion des photosun equivalent de HTML template en Java ...
Plus de sujets relatifs à : template c++ -> Java


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