Programmation » Typecasting "automatique" en C++
Catégorie:  
   
Typecasting "automatique" en C++
Publié le 10/08/2007 @ 12:05:13,
Par rfr
Hello la foule :wink:

J'ai un petit problème C++ (vous savez, le langage hyper lourd et bien compliqué que tout le monde déteste </end of fud>).

Voila, je dispose d'une classe String (pas la classe standard ...) munie d'un constructeur du type String(const char *).

Dans mon code, j'aimerais qu'une méthode du type:

A::DoSomething(String & a) ou A::DoSomething(String * a)

puis être utilisée comme suit:

A::DoSomething("Hello World");

En gros, une bonne conversion automatique sans devoir chaque fois surcharger les methodes pour qu'elles acceptent les deux types (String et char *).

Si quelqu'un a une solution, je lui en serais très reconnaissant. Dans l'absolu, la solution doit fonctionner sous Visual Studio et gcc vu que mon brol tourne sous windows et linux.

Merci à tous les experts C++ :wink:

Dernière édition: 10/08/2007 @ 12:06:21
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
Typecasting "automatique" en C++
Publié le 10/08/2007 @ 12:08:25,
Par zion
Y a pas l'overload en C++ comme cela existe en Pascal?
En POO tu écrirais:

DoSomething(a: string); overload;
DoSomething(a: PChar); overload;

Mais bon tu n'as pas ton problème de string déjà en pascal il va le transformer tout seul :ddr555:
Je suis le Roy :ocube:
   
Typecasting "automatique" en C++
Publié le 10/08/2007 @ 12:19:29,
Par rfr
Y a pas l'overload en C++ comme cela existe en Pascal?
En POO tu écrirais:

DoSomething(a: string); overload;
DoSomething(a: PChar); overload;

Mais bon tu n'as pas ton problème de string déjà en pascal il va le transformer tout seul :ddr555:


Je ne veux pas de surcharge des méthodes :wink:

La raison est simple: mon "brol" utilise à profusion l'héritage unique (enfin presque, car j'utilise certaine conventions pour utiliser des "Interfaces" et des classes abstraites) à partir d'un objet racine Object (tout comme en java quoi). Le principe est net, clair et simple, n'en déplaise au défenseur du C++. Le seul truc qui m'énerve, c'est cette difficulté à se passer du char * ... merci l'héritage du C ... Ce qui m'empêche de généraliser totalement l'utilisation de mon objet racine dans mes méthodes (pour des Map ou des listes par exemple).

Je veux arriver à ce que le C++ comprenne, d'une manière ou d'une autre, que "xxxx" est un String et non un char * ...
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
Typecasting "automatique" en C++
Publié le 10/08/2007 @ 12:34:22,
Par zion
En gros, une bonne conversion automatique sans devoir chaque fois surcharger les methodes pour qu'elles acceptent les deux types


Ah oué flute...

Euh... Pascal est ton ami, sinon je laisse ma langue au chat :petrus:
Je suis le Roy :ocube:
   
Typecasting "automatique" en C++
Publié le 10/08/2007 @ 13:37:10,
Par philfr
C++ n'est pas à typage dynamique, et les conversions implicites n'existent que pour les types numériques... :spamafote:

Je crains que la surcharge ne soit ton seul salut...

Ou alors appeler toujours explicitement (ce qui n'est pas moins lisible AMHA):

A::DoSomething(String("Hello World"));
   
Typecasting "automatique" en C++
Publié le 10/08/2007 @ 14:22:23,
Par ovh
Je ne suis pas un gourou du C++ mais quand même j'ai eu des cours dessus et je l'ai pas mal utilisé (maintenant moins), et à ce que je me souvienne la solution pour ce type de cas c'est la surcharge de fonction, clairement :spamafote:
Je n'ai rien à voir avec www.ovh.com
   
Typecasting "automatique" en C++
Publié le 10/08/2007 @ 16:25:32,
Par rfr
Je crois que je vais devoir me tapper un truc du genre si je vous écoute bien ...

#define _S(x) String(x)
#define _PS(x) &String(x)

Ou pour éviter la création d'objets inutiles:

#define _S(x) StringManager::GetString(x)
#define _PS(x) StringManager::GetStringPtr(x)

Cette dernière solution ayant au moins l'intérêt de ne créer l'objet qu'une seule fois pour chaque string unique. Au cout, bien évidement, d'un lookup dans une hashtable.
Ca assure aussi qu'on considère l'objet crée comme +/- "statique" et que donc on ne se tracasse plus de son existence pour la désallocation.

Mais comme les strings fixes seraient de toute façon marginales, on ne pénalise pas trop les perfs.

Bon ok, c'est pas terribles les defines mais si ça me permet de m'en sortir pour le reste...
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
Typecasting "automatique" en C++
Publié le 10/08/2007 @ 17:02:23,
Par kortenberg
Quand tu utilises String(x) tu ne dois pas te soucier de la désallocation.
   
Typecasting "automatique" en C++
Publié le 10/08/2007 @ 20:06:50,
Par gizmo
Quand tu utilises String(x) tu ne dois pas te soucier de la désallocation.


Il n'utilise pas le String standard, donc on n'en sait rien.
Concept vivant.
   
Typecasting "automatique" en C++
Publié le 10/08/2007 @ 20:26:25,
Par kortenberg
il n'a pas fait de new -> au pire destrution automatique à la fin du bloque.
   
Typecasting "automatique" en C++
Publié le 10/08/2007 @ 21:01:43,
Par rfr
il n'a pas fait de new -> au pire destrution automatique à la fin du bloque.


Oui mais non ... justement ... Je ne veux pas que l'objet soit détruit.

Quand tu passes une "chaine" comme paramètre d'une méthode, le compilateur alloue une fois pour toute la chaine dans l'exécutable. On est donc sûr qu'à chaque instant, la référence vers cette chaine reste valide, ou que l'on soit dans le flow d'éxecution du process.

Le comportement n'est pas le même s'il y a destruction automatique de l'objet.
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
Typecasting "automatique" en C++
Publié le 11/08/2007 @ 15:18:31,
Par antp
Dans la MFC de Visual C++5 ils ont un opérateur LPCSTR permettant de combiner les char* avec les CString (CString::operator LPCSTR) mais je ne sais plus dans quel sens c'est (CString => char* ou l'inverse), et je ne sais plus comment ça marche.
En résumé, mon post ne sert peut-être à rien :grin:
mes programmes ·· les voitures dans les films ·· champion des excuses bidons
   
Typecasting "automatique" en C++
Publié le 12/08/2007 @ 10:31:00,
Par KangOl

Dans mon code, j'aimerais qu'une méthode du type:

A::DoSomething(String & a) ou A::DoSomething(String * a)

puis être utilisée comme suit:

A::DoSomething("Hello World");


Pour ça, il te faut

  1. A::DoSomething(String const & a)


Et oui la chaîne "Hello World" est constante :wink:
Répondre - Catégorie:  
Informaticien.be - © 2002-2024 AkretioSPRL  - Generated via Kelare
The Akretio Network: Akretio - Freedelity - KelCommerce - Votre publicité sur informaticien.be ?