Omskriving C ++ metoder i C

stemmer
0

Hvordan kan jeg gjøre ekvivalenter til disse metodene i C? Jeg leste et sted at de kunne bli erstattet med funksjoner som tar en struktur peker som første parameter, men jeg er ikke sikker på hvordan du gjør dette, hvis det er den riktige tingen å gjøre.

struct SCustomKeys
{
    struct SCustomKey Save[10];
    struct SCustomKey Load[10];
    struct SCustomKey Slot[10];

    struct SCustomKey PrintScreen;
    struct SCustomKey LastItem; // dummy, must be last

    //--methods--
    struct SCustomKey &key(int i) { return ((SCustomKey*)this)[i]; }
    struct SCustomKey const &key(int i) const { return ((SCustomKey*)this)[i]; }
};

Her er et eksempel på hvordan de brukes:

void ZeroCustomKeys (SCustomKeys *keys)
{
    int i = 0;

    SetLastCustomKey(&keys->LastItem);
    while (!IsLastCustomKey(&keys->key(i))) {
        keys->key(i).key = 0;
        keys->key(i).modifiers = 0;
        i++;
    };
}

Mer kontekst: http://pastebin.com/m649210e8

Takk for hjelpen. Jeg har ikke vært i stand til forslag til erstatning for C ++ metode å jobbe med denne funksjonen ennå skjønt. Noen ideer om hvordan å nærme seg dette?

void InitCustomKeys (struct SCustomKeys *keys)
{
    UINT i = 0;

    SetLastCustomKey(&keys->LastItem);
    while (!IsLastCustomKey(&keys->key(i))) {
        SCustomKey &key = keys->key(i);
        key.key = 0;
        key.modifiers = 0;
        key.handleKeyDown = NULL;
        key.handleKeyUp = NULL;
        key.page = NUM_HOTKEY_PAGE;
        key.param = 0;
        i++;
    };

    //an example key
    keys->PrintScreen.handleKeyDown = HK_PrintScreen;
    keys->PrintScreen.code = PrintScreen;
    keys->PrintScreen.name = LPrint Screen;
    keys->PrintScreen.page = HOTKEY_PAGE_MAIN;
    keys->PrintScreen.key = VK_PAUSE;
}

Og den nye funksjonen jeg prøver nå er:

 struct SCustomKey* key(struct SCustomKeys *scs, int i) { 
    return &(((SCustomKey*)scs)[i]); 
 }
Publisert på 31/03/2009 klokken 18:05
kilden bruker
På andre språk...                            


4 svar

stemmer
5

I utgangspunktet, i stedet for å ha et medlem funksjon som:

struct SCustomKey &key(int i) { return ((SCustomKey*)this)[i]; }

Du må skrive dette som en funksjon som tar en peker til en SCustomKeys som det er første argument.

Funksjonen vil se ut:

SCustomKey* key(SCustomKeys* customKeys, int i) 
{ return ((SCustomKey*)(customKeys)+i); }

Dette bør gi deg en peker til det elementet du prøver å få tilgang.

Svarte 31/03/2009 kl. 18:10
kilden bruker

stemmer
4
 struct SCustomKey &key(int i) { return ((SCustomKey*)this)[i]; }
 struct SCustomKey const &key(int i) const {
     return ((SCustomKey*)this)[i]; 
 }

vil bli

 struct SCustomKey* key(struct SCustomKeys *scs, int i) { 
    /* Shouldn't you be using one of Load/Save/... arrays? */
    return &(((SCustomKey*)scs)[i]); 
 }

C har ikke constfunksjoner. Så, bare én versjon.

Svarte 31/03/2009 kl. 18:08
kilden bruker

stemmer
1

Jeg skal forklare ved hjelp av f.eks. Dette er din kode (faktisk bare metodene):

struct SCustomKeys
{
    // snipped

    //--methods--
    struct SCustomKey &key(int i) { return ((SCustomKey*)this)[i]; }
    struct SCustomKey const &key(int i) const { return ((SCustomKey*)this)[i]; }
};

Og dette er hvordan jeg skulle skrive det på C:

  1. legge til en peker til struct metoden skal virke på.
  2. returnere pekere i stedet for referanser, siden C ikke har referanser.
  3. Jeg tror ikke constkan brukes samme i C, så vi trenger bare én versjon.
struct SCustomKeys
{
    // snipped
};
//--methods-- (outside the struct)

struct SCustomKey *key(struct sCustomkey *this, int i) { return &(((SCustomKey*)this)[i]); }
Svarte 31/03/2009 kl. 18:11
kilden bruker

stemmer
0

Tanken er at du ville passere i en peker til en SCustomKeys som den første (vel, spiller det egentlig ingen rolle, det kan være noen) parameter, og bruke det i stedet for "dette".

Svarte 31/03/2009 kl. 18:09
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more