Переписывание методов C ++ на C - PullRequest
0 голосов
/ 31 марта 2009

Как я могу сделать эквиваленты этим методам в C? Я где-то читал, что их можно «заменить функциями, которые принимают указатель структуры в качестве первого параметра», но я не уверен, как это сделать, если это правильно.

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

Вот пример того, как они используются:

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

Больше контекста: http://pastebin.com/m649210e8

Спасибо за помощь. Я пока не смог заменить предложенный метод C ++, работающий с этой функцией. Есть идеи как подойти к этому?

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 = L"Print Screen";
    keys->PrintScreen.page = HOTKEY_PAGE_MAIN;
    keys->PrintScreen.key = VK_PAUSE;
}

И новая функция, которую я сейчас пробую:

 struct SCustomKey* key(struct SCustomKeys *scs, int i) { 
    return &(((SCustomKey*)scs)[i]); 
 }

Ответы [ 4 ]

5 голосов
/ 31 марта 2009

По сути, вместо функции-члена, такой как:

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

Вам нужно будет переписать это как функцию, которая принимает указатель на SCustomKeys в качестве первого аргумента.

Функция будет выглядеть так:

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

Это должно предоставить вам указатель на элемент, к которому вы пытаетесь получить доступ.

4 голосов
/ 31 марта 2009
 struct SCustomKey &key(int i) { return ((SCustomKey*)this)[i]; }
 struct SCustomKey const &key(int i) const {
     return ((SCustomKey*)this)[i]; 
 }

станет

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

C не имеет const функций. Итак, только одна версия.

1 голос
/ 31 марта 2009

Я объясню на вашем примере. Это ваш код (на самом деле только методы):

struct SCustomKeys
{
    // snipped

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

И вот как я написал бы это в C:

  1. добавить указатель на структуру, с которой должен работать метод.
  2. возвращают указатели вместо ссылок, поскольку C не имеет ссылок.
  3. Я не думаю, что const можно использовать одинаково в C, поэтому нам нужна только одна версия.
struct SCustomKeys
{
    // snipped
};
//--methods-- (outside the struct)

struct SCustomKey *key(struct sCustomkey *this, int i) { return &(((SCustomKey*)this)[i]); }
0 голосов
/ 31 марта 2009

Идея состоит в том, что вы передадите указатель на SCustomKeys в качестве первого (ну, на самом деле это не имеет значения; он может быть любой) параметра и будете использовать его вместо «this».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...