用C模仿写C++代码去学习C/C++(二)

初步模仿完成,接着要模仿继承

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;

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

#endif 
新增加两个方法,GetItem和SetItem



player.c

#include <stdio.h>
#include <stdlib.h>
#include "player.h"

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

static void PlayIndeed(IPlayer* pThis);
static void StopIndeed(IPlayer* pThis);
static int GetItemIndeed(IPlayer* pThis);
static void SetItemIndeed(IPlayer* pThis, int nItem);

IPlayer* GetPlayer()
{
	IPlayer* pReturn = (IPlayer*)malloc(sizeof(CPlayer));
	pReturn->Play = PlayIndeed;
	pReturn->Stop = StopIndeed;
	pReturn->GetItem = GetItemIndeed;
	pReturn->SetItem = SetItemIndeed;
	((CPlayer*)pReturn)->m_nItem = 0;
	return pReturn;
}

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

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

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

static int GetItemIndeed(IPlayer* pThis)
{
	int nReturn = -1;
	if(pThis != NULL)
	{
		nReturn = ((CPlayer*)pThis)->m_nItem;
	}
	return nReturn;
}

static void SetItemIndeed(IPlayer* pThis, int nItem)
{
	if(pThis != NULL)
	{
		((CPlayer*)pThis)->m_nItem = nItem;
	}
}

类CPlayer继承于IPlayer,并将其操作实例化



测试例子main.c

#include <stdio.h>
#include <stdlib.h>
#include "player.h"

int main()
{
	int nItem = 0;
	IPlayer* pPlayer = GetPlayer();
	pPlayer->Play(pPlayer);
	pPlayer->Stop(pPlayer);
	pPlayer->SetItem(pPlayer, 10);
	nItem = pPlayer->GetItem(pPlayer);
	printf("item is: %d\n", nItem);
	FreePlayer(&pPlayer);
	getchar();
	return 0;
}
模仿成功。


你可能感兴趣的:(用C模仿写C++代码去学习C/C++(二))