Различные реализации файла заголовка C - PullRequest
5 голосов
/ 08 декабря 2010

Как добавить несколько реализаций в этот заголовочный файл:

MoveAgent.h

#ifndef _GAMEAGENT_
#define _GAMEAGENT_

#include "Defs.h"
#include "GameModel.h"

MoveDirection takeDirection(GameState *gs);

#endif _GAMEAGENT_

MoveAgent.c: допустим, у меня есть реализация, которая будет возвращать случайный ход

MoveDirection takeDirection(GameState *gs) {    
    MoveDirection dir = DIR_NONE;       
    while (dir == DIR_NONE) {
        int index = arc4random() % gs->moves_total;     
        MoveDirection tempDir = gs->moves[index];       
        if (tempDir != oppDir(gs->car.direction)) {
            dir = tempDir;
        }
    }
    return dir;
}

Каков практический способ иметь несколько реализаций этой функции?

Как вы можете догадаться, я программист на Java, пытаюсь создать простую игру для изучения C, поэтому я пытаюсь сделать это для имитации интерфейса Java.

Есть идеи?

1 Ответ

7 голосов
/ 08 декабря 2010

Возможно, это слишком много в глубоком конце, но:

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

MoveAgent.h

extern MoveDirection (*takeDirection)(GameState *gs);

MoveAgent.c

MoveDirection takeDirectionRandom(GameState *gs)
{
    ...
}

MoveDirection takeDirectionSpiral(GameState *gs)
{
    ...
}

Mover.c

#include "MoveAgent.h"

// Default move is random
MoveDirection (*takeDirection)(GameState *gs) = takeDirectionRandom;

void setRandomMover(void)
{
    takeDirection = takeDirectionRandom;
}

void setSpiralMover(void)
{
    takeDirection = takeDirectionSpiral;
}

void mover(GameState *gs)
{
    ...;
    MoveDirection dir = takeDirection(gs);
    ...;
}

Итак, где-то вдоль линии вы вызываете одну из setXxxxxMover() функций, а затем вы перемещаетесь, используя механизм, установленный последней из двух вызванных функций.

Вы также можете вызвать функцию, используя длинную запись:

    MoveDirection dir = (*takeDirection)(gs);

Когда-то очень давно (в 1980-х и ранее) эта запись была необходима. Мне все еще нравится это, потому что это ясно (мне), что это указатель на функцию, которая используется.

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