CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Opérateur d'assignement?

SuperDindon
SuperDindon
Niveau 8
23 janvier 2003 à 17:09:59

Salut à tous,

j´ai cette fois un problème avec les opérateurs d´assignement. En fait j´aimerais pouvoir assigner une structure à un type de base ( ou presque, c´est LPVOID). Bon, le blem, c´est que, si j´ai bien compris, on est obligé de déclarer l´opérateur au sein de la classe ou de la struct. En clair, cela signifie-t-il il n´y a aucun moyen de le surcharger en tant qu´opérateur global ou par un autre procédé pour y parvenir?

Next, tant que j´y suis, est-ce que c´est cet opérateur que je dois surcharger si je veux pouvoir utiliser ma structure dans une fonction necessitant comme argument un void*?

Ex.: VirtualFree ( MaStruct , 0, 0);

Passage
Passage
Niveau 10
23 janvier 2003 à 17:14:58

Tuju ! J´ai rien compris a la question ! !!

GamerFou2
GamerFou2
Niveau 7
23 janvier 2003 à 17:21:03

Je crois qu´il parle du cast . .. ( enfin d´après ce que j´ai compris)

SuperDindon
SuperDindon
Niveau 8
23 janvier 2003 à 17:27:57

Bon, OK, de façon plus claire ( c´est mon code):

typedef struct {
LPVOID Pointer;
HMMMemType Type;
unsigned int Size;
bool Locked;
LPHMMInstance InstOwner;

HMMPointer& operator = ( LPVOID & ) ;
}HMMPointer, *LPHMMPointer;

Voilà, mais ce n´est pas ça que je veux, mon but étant de pouvoir convertir le HMMPointer en LPVOID.

SuperDindon
SuperDindon
Niveau 8
23 janvier 2003 à 17:29:42

Et donc le blem c´est que je ne peux pas créer d´opérateur global pour ça...

GamerFou2
GamerFou2
Niveau 7
23 janvier 2003 à 19:00:44

Hmm ya un truc qui me gène là dedans, en quoi ton HMMPointer est un pointeur ? tel que tu l´as défini dans l´exemple il ne s´agit pas du tout d´un pointeur . .. ca serait pas plutôt LPHMMPointer que tu veux convertir ?

SuperDindon
SuperDindon
Niveau 8
24 janvier 2003 à 05:26:23

Non, un autre ex.:

LPVOID Essai;
HMMPointer Temp;

//Et je voudrais qu´on puisse faire...:
Essai = Temp;
//Et que Essai prenne la valeur du membre Pointer de Temp

Passage
Passage
Niveau 10
24 janvier 2003 à 10:26:08

Si j´ai bien compris ( mais c´est po sur ! )

Ben y a une impossibilité ici ! !!!!

Extrait de la Doc Micro...
"The following operators can only be overloaded in class scope as nonstatic members: assignment operator ´=´, class member access operator ´->´, subscripting operator ´[]´, and function call operator ´( ) ´."

Voila comment je vois la chose "schematiquement":

class A {....}
class B {....}

A P1;
B P2;

P2 = P1;

ceci equivaux a
P2.=(P1);
Donc l´operateur = pris est celui definit par P2.

Or si P2 est de type void*
alors le = est le = du void* ( Heurk ! !)
C´est pour cela que que si P1 est de type different, tu est prié de faire un petit cast alors P2 = ( void*)P1; equivaux a P2.=((void*)P1)
-et ca ton compilo il aime ! !! -

La valeur retourné par l´operateur egal ne sert qu´a permetre un truc du style
P1=P2=P3;
Lors de l´execution cela ce traduit par :
P1.=( P2.=(P3));
Hors si l´operateur egal renvoie rien alors l´affectation de P1 ne se fait pas ( puisqu´il n´a rien a affecter)

A ta place je ferais soit :
P1 = P2.GetPtr(); //Accesseur normal

Si vraiment tu veux passer par un operateur
P2>>P1; // Note alors que j´ai contourné le probleme en placant P2 comme instance primaire de l´operation ! !!
La declaration de >> est donc
void* P2::operator >>(void* &);
Et la j´avoue que cela me file des bouton de filer une reference sur un pointeur ( mais chacun son avis )
Je prefere alors plutot
P2>>&1
avec
void* P2::operator >>(void** VoidPtr);

Cela te convient il ?

SuperDindon
SuperDindon
Niveau 8
24 janvier 2003 à 19:03:21

Ouf, merci Passage, alors oui, tu as bien compris, mais tu ne connais donc aucun moyen pour utiliser l´opérateur = ?
Mon but, mais tu dois l´avoir compris, c´est que ce type soit transparent aux pointers de base. La structure est en fait utilisée par mon gestionnaire de mémoire. Ce n´est pas vital mais ce serait sympa de simplifier leur utilisation.
Une idée?

Passage
Passage
Niveau 10
24 janvier 2003 à 19:06:06

J´reviens Lundi.

SuperDindon
SuperDindon
Niveau 8
24 janvier 2003 à 19:08:54

Merci mais ça ne m´avance pas beaucoup...

Passage
Passage
Niveau 10
24 janvier 2003 à 19:11:23

Nan, je reviens tout de suite.

Vue la doc cité dans mon message et l´utilisation j´crois bien qu´il y a impossibilité.

SuperDindon
SuperDindon
Niveau 8
24 janvier 2003 à 19:16:13

Bon bah mer... alors

M^me pas une toute petite idée?

GamerFou2
GamerFou2
Niveau 7
24 janvier 2003 à 20:55:16

Comme l´a dit Passage tu ne peux pas utiliser un opérateur global pour l´assignement, il faut qu´il appartienne à une classe ou structure . ..

Je sais pas si ca pourra t´aider mais tu peux toujours écrire un truc dans ce genre :

// b = a

  1. define ASSIGN(a,b) a.operator =(b);

ce qui dans ton cas te permet d´utiliser ton opérateur

ASSIGN(Temp,Essai)

Désolé c´est tout ce que j´ai à te proposer : )

SuperDindon
SuperDindon
Niveau 8
25 janvier 2003 à 05:47:03

Non, le but c´était de simplifier.
Bon bah je crois que je vais abandonner, et puis c´est tout

Merci quand même

SuperDindon
SuperDindon
Niveau 8
25 janvier 2003 à 14:55:36

Oulala, mais si, c´est possible.
Seulement il faut pas essayer de surcharger l´opérateur d´assignement, mais de créer une "règle de conversion".

Cela donne:

typedef struct {
LPVOID Pointer;
HMMMemType Type;
unsigned int Size;
bool Locked;
LPHMMInstance InstOwner;

operator void* ( ) {return Pointer};

}HMMPointer, *LPHMMPointer;

Je crois que c´est ça mais en tout cas c´en est pas loin.
Et après on peut faire autant:

LPVOID a;
HMMPointer b;

a = b;

que:

CopyMemory(b,a,...);

Ca y est, je suis un dindon heureux

SalaN87
SalaN87
Niveau 8
25 janvier 2003 à 15:36:04

g rien compris a ce que vous dites lol g saisi les mots pointeurs et void ^^

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment