先点一下基础点: 模板类是不能再.cpp定义的! 模板类是不能再.cpp定义的! 模板类是不能再.cpp定义的!(坑爹一上午)
RingClass.hpp
#pragma once
#include <iostream>
#include <cstring>
typedef unsigned char uint8_t;
class AudioData
{
public:
int iChannelSize;
short nPcmData[1000];
};
class PCM48Data
{
public:
int iChannelSize;
short nPcmData[48][1000];
};
class VideoData
{
public:
int iChannelSize;
short nYData[1000];
short nUData[1000];
short nVData[1000];
};
template <typename T>
class RingQueue
{
public:
RingQueue();
~RingQueue();
public:
uint8_t Init(int p_iSize);
uint8_t Delete();
uint8_t IsEmpty();
uint8_t IsFull();
uint8_t Push(T* p_pData);
uint8_t Pop(T* p_pData);
void Printf();
int GetSize();
private:
void TailAdd()
{
m_iTail++;
m_iTail = m_iTail % m_iSize;
}
void HeadAdd()
{
m_iHead++;
m_iHead = m_iHead % m_iSize;
}
private:
int m_iLength;
int m_iSize;
int m_iHead;
int m_iTail;
T* m_pDatas;
private:
};
template<typename T>
RingQueue<T>::RingQueue()
{
m_iLength = 0;
m_iSize = 0;
m_iHead = 0;
m_iTail = 0;
m_pDatas = NULL;
}
template<typename T>
RingQueue<T>::~RingQueue()
{
Delete();
}
template<typename T>
uint8_t RingQueue<T>::Init(int p_iSize)
{
if (m_pDatas == NULL)
{
m_pDatas = (T *)malloc(p_iSize * sizeof(T));
if (m_pDatas != NULL)
{
memset(m_pDatas, 0, p_iSize * sizeof(T));
}
else
{
return -1;
}
m_iSize = p_iSize;
}
else
{
return -1;
}
return 0;
}
template<typename T>
uint8_t RingQueue<T>::Delete()
{
if (m_pDatas != NULL)
{
free(m_pDatas);
m_pDatas = NULL;
}
return 0;
}
template<typename T>
uint8_t RingQueue<T>::IsEmpty()
{
if (m_iLength == 0)
{
return 1;
}
return 0;
}
template<typename T>
uint8_t RingQueue<T>::IsFull()
{
if (m_iLength / m_iSize)
{
return 1;
}
return 0;
}
template<typename T>
uint8_t RingQueue<T>::Push(T* p_pData)
{
memcpy(&m_pDatas[m_iTail], p_pData, sizeof(T));
if (IsFull())
{
HeadAdd();
}
TailAdd();
m_iLength++;
if (m_iLength > m_iSize)
{
m_iLength = m_iSize;
}
return 1;
}
template<typename T>
uint8_t RingQueue<T>::Pop(T* p_pData)
{
if (IsEmpty())
{
return 0;//queue empty
}
memcpy(p_pData, &m_pDatas[m_iHead], sizeof(T));
memset(&m_pDatas[m_iHead], 0, sizeof(T));
HeadAdd();
m_iLength--;
return 1;
}
template<typename T>
void RingQueue<T>::Printf()
{
printf("size=0x%x, start=%d, end=%d\n", m_iSize, m_iHead, m_iTail);
}
template<typename T>
int RingQueue<T>::GetSize()
{
return m_iLength;
}
main.cpp
#include "RingClass.hpp"
#include <iostream>
using namespace std
int main()
{
//RingQueue<AudioData> stRingQueue;
RingQueue<VideoData> stRingQueue;
int ret = stRingQueue.Init(15);
if (-1 == ret)
{
printf("RingQueue Init failed!\n");
getchar();
return -1;
}
VideoData test;
VideoData show;
char str[128] = { 0 };
char tep[3][10];
int nub = 0;
for (int i = 1; i < 65; i++)
{
memset(tep, 0, sizeof(char) * 3 * 10);
sprintf(str, "========================%d", i);
char* temp = (char*)tep;
memcpy(test.nUData, str, strlen(str));
memset(tep, 0, sizeof(char) * 3 * 10);
sprintf(str, "========================%d", ++i);
memcpy(test.nVData, str, strlen(str));
memset(tep, 0, sizeof(char) * 3 * 10);
sprintf(str, "========================%d", ++i);
memcpy(test.nYData, str, strlen(str));
test.iChannelSize = strlen(str);
stRingQueue.Push(&test);
}
stRingQueue.Printf();
for (int i = 0; i < 11; i++)
{
if (stRingQueue.Pop(&show))
{
printf("/****************************************\n");
char* temp = (char*)show.nUData;
temp[26] = '\0';
printf("%s\n", temp);
temp = (char*)show.nVData;
temp[26] = '\0';
printf("%s\n", temp);
temp = (char*)show.nYData;
temp[26] = '\0';
printf("%s\n", temp);
printf("****************************************/\n");
}
}
getchar();
return 0;
}