CでC++コードをまねてC/C++(三)を学びます

3159 ワード

次に多様化を模倣する
player.h
#ifndef __PLAYER_H__
#define __PLAYER_H__

typedef struct IPlayer
{
	void (*Play)(struct IPlayer* pThis);
	void (*Stop)(struct IPlayer* pThis);
	int (*GetItem)(struct IPlayer* pThis);
	void (*SetItem)(struct IPlayer* pThis, int nItem);
}IPlayer;

typedef enum
{
	PLAYER_TYPE_A,
	PLAYER_TYPE_B,
}PLAYER_TYPE_E;

IPlayer* GetPlayer(PLAYER_TYPE_E eType); 
void FreePlayer(IPlayer** pInstance);

#endif 

player.c
#include <stdio.h>
#include <stdlib.h>
#include "player.h"
#include "player_a.h"
#include "player_b.h"

static void PlayIndeed(IPlayer* pThis);
static void StopIndeed(IPlayer* pThis);

IPlayer* GetPlayer(PLAYER_TYPE_E eType)
{
	IPlayer* pReturn = NULL;
	switch(eType)
	{
	case PLAYER_TYPE_A:
		pReturn = GetPlayerA();
		break;
	case PLAYER_TYPE_B:
		pReturn = GetPlayerB();
		break;
	default:
		break;
	}
	if(pReturn != NULL)
	{
		pReturn->Play = PlayIndeed;
		pReturn->Stop = StopIndeed;
	}
	return pReturn;
}

void FreePlayer(IPlayer** pInstance)
{
	if(pInstance != NULL && *pInstance != NULL)
	{
		free(*pInstance);
		*pInstance = NULL;
	}
}

static void PlayIndeed(IPlayer* pThis)
{
	printf("PlayIndeed
"); } static void StopIndeed(IPlayer* pThis) { printf("StopIndeed
"); }

player_a.h
#ifndef __PLAYER_A_H__
#define __PLAYER_A_H__

#include "player.h"

IPlayer* GetPlayerA();

#endif

player_a.c
#include <stdio.h>
#include <stdlib.h>
#include "player_a.h"

typedef struct
{
	IPlayer pPlayer;
	int m_nItem;
}PlayerA;

static int GetItemIndeedA(IPlayer* pThis);
static void SetItemIndeedA(IPlayer* pThis, int nItem);

IPlayer* GetPlayerA()
{
	IPlayer* pReturn = (IPlayer*)malloc(sizeof(PlayerA));
	pReturn->GetItem = GetItemIndeedA;
	pReturn->SetItem = SetItemIndeedA;
	((PlayerA*)pReturn)->m_nItem = 'a';
	return pReturn;
}

static int GetItemIndeedA(IPlayer* pThis)
{
	int nReturn = -1;
	if(pThis != NULL)
	{
		nReturn = ((PlayerA*)pThis)->m_nItem;
	}
	printf("GetItemIndeed------A 
"); return nReturn; } static void SetItemIndeedA(IPlayer* pThis, int nItem) { if(pThis != NULL) { ((PlayerA*)pThis)->m_nItem = nItem; } printf("SetItemIndeed------A
"); }

BのコードはAとあまり違わないので,ここでは貼らない
テストコードc
#include <stdio.h>
#include <stdlib.h>
#include "player.h"

int main()
{
	IPlayer* pPlayerA = GetPlayer(PLAYER_TYPE_A);
	IPlayer* pPlayerB = GetPlayer(PLAYER_TYPE_B);
	pPlayerA->Play(pPlayerA);
	pPlayerA->Stop(pPlayerA);
	pPlayerA->SetItem(pPlayerA, 10);

	pPlayerB->Play(pPlayerB);
	pPlayerB->Stop(pPlayerB);
	pPlayerB->SetItem(pPlayerB, 5);
	printf("A item is: %d , B item is: %d
", pPlayerA->GetItem(pPlayerA), pPlayerB->GetItem(pPlayerB)); FreePlayer(&pPlayerA); FreePlayer(&pPlayerA); getchar(); return 0; }

テスト出力
出力を見るとprintfの文字列の順序は右から左、つまりコンピュータが文字列を制御端に出力する過程は右から左であることがわかります.