none
代码中的一些不能理解呀.很是苦恼.请求帮助.谢谢你们. RRS feed

  • 问题

  • #include "stdio.h"
    template<class POINT_TYPE,int MAX_POINTS>class VarQueue
    {
    public:
    	VarQueue()
    	{
    		m_MaxCount=MAX_POINTS;
    		m_Count=0;
    	}
    	VarQueue(unsigned int MaxCount)
    	{
    		if(MaxCount>MAX_POINTS)
    			m_MaxCount=MAX_POINTS;
    		else
    			m_MaxCount=MaxCount;
    		m_Count=0;
    	}
    
    	unsigned int PopPoint(POINT_TYPE *Point);
    	unsigned int AppendPoint(const POINT_TYPE &Point);
    	bool GetPoint(POINT_TYPE *Point,unsigned int Position)const;
    	unsigned int GetCount()const;
    	void ClearQueue();
    private:
    	unsigned int m_MaxCount;
    	unsigned int m_Count;
    	POINT_TYPE m_Queue[MAX_POINTS];
    };
    
    class CElement
    {
    public:
    	CElement(){fValue=0.0;}
    	CElement(float value){fValue=value;}
    
    	CElement & operator=(int value)
    	{
    		fValue=(float)value;
    		return *this;
    	}
    	CElement & operator=(float value)
    	{
    		fValue=value;
    		return *this;
    	}
    	CElement & operator=(CElement elem)
    	{
    		fValue=elem.fValue;
    		return *this;
    	}
    	operator float()
    	{
    		return fValue;
    	}
    	float GetValue()const
    	{
    		return fValue;
    	}
    private:
    	float fValue;
    };
    
    template<class POINT_TYPE,int MAX_POINTS>
    unsigned int VarQueue<POINT_TYPE,MAX_POINTS>::PopPoint(POINT_TYPE *Point)
    {
    	unsigned int i=0;
    	if(m_Count>0)
    	{
    		if(NULL!=Point)
    			*Point=m_Queue[0];
    		for(i=1;i<m_Count;i++)
    		{
    			m_Queue[i-1]=m_Queue[i];
    			                    
    			                  
    			                     
    		}
    		m_Count--;
    	}
    	return m_Count;
    }
    
    template<class POINT_TYPE,int MAX_POINTS>
    unsigned int VarQueue<POINT_TYPE,MAX_POINTS>::AppendPoint(const POINT_TYPE &Point)
    {
    	if(m_Count<m_MaxCount) 
    		m_Queue[m_Count++]=Point; 
    	return m_Count;
    }
    
    template<class POINT_TYPE,int MAX_POINTS>
    bool  VarQueue<POINT_TYPE,MAX_POINTS>::GetPoint(POINT_TYPE *Point, unsigned int Position) const
    {
    	if(Position<m_Count && NULL!=Point)
    	{
    		*Point=m_Queue[Position];
    		return true;
    	}
    	else
    		return false;
    }
    
    template<class POINT_TYPE,int MAX_POINTS>
    inline unsigned int VarQueue<POINT_TYPE,MAX_POINTS>::GetCount() const
    {
    	return m_Count;
    }
    
    template<class POINT_TYPE,int MAX_POINTS>
    void VarQueue<POINT_TYPE,MAX_POINTS>::ClearQueue()
    {
    	m_Count=0;
    }
    
    int main(int argc,char *argv[])
    {
    	VarQueue<int,50>iQueue(20);
    	VarQueue<CElement,30>fQueue(10);
    	int ival=0;
    	unsigned count=0;
    	CElement fval=1.0;
    
    	unsigned int i; 
    	for(i=0;i<4;i++) 
    		iQueue.AppendPoint(i);//当iQueue访问AppendPoint函数,AppendPoint(const POINT_TYPE &Point),POINT_TYPE是不是int & Point?
    
    	count=iQueue.GetCount();
    	for(i=0;i<count;i++)
    	{
    		iQueue.PopPoint(&ival);//请详细解释下这个函数的执行,在PopPoint函数定义中看得很乱?
    		fQueue.AppendPoint((float)ival);//请详细解释下这个函数的执行,在PopPoint函数定义中看得很乱?
    
    	}
    
    	for(i=0;i<fQueue.GetCount();i++)
    	{
    		fQueue.GetPoint(&fval,i);//请详细解释下这个函数的执行,在PopPoint函数定义中看得很乱?
    
    		printf("%4.2f\n",fval.GetValue());//为什么会是0.00呢??
    	}
    	iQueue.ClearQueue();
    	fQueue.ClearQueue();
    
    	return 0;
    }


    这个代码输出:

    0.00

    1.00

    2.00

    3.00

     

    输出上面结果是什么原理,我不太明白,希望有人帮帮我,谢谢你们.函数的声明和定义我都看得懂,可是这个main(){}里面的调用让我很苦恼.

    2011年11月10日 7:17

答案

  •  你好:

     

    unsigned int VarQueue<POINT_TYPE,MAX_POINTS>::PopPoint(POINT_TYPE *Point)

    {

                    unsigned int i=0;

                    if(m_Count>0)

                    {

                                    if(NULL!=Point)

                                                    *Point=m_Queue[0];                // 数组第一个元素的值赋给*point

                                    for(i=1;i<m_Count;i++)

                                    {

                                                    m_Queue[i-1]=m_Queue[i];  // 数组后一位的值赋给前一位,即数

                                                                                                                // 循环过后,数组元素往前挪一位。

                                                                                                                // 例如 原数组 1 2 3 4 变为 2 3 4   

                                                                        

                                    }

                                    m_Count--;                                                 // 数组长度减一

                    }

                    return m_Count;

    }                              // 这个函数 从数组中抛出第一个元素,并使原数组长度减一,其他元素                  

                                   //往前挪动一位


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 hytjvt 2011年11月12日 14:48
    2011年11月11日 7:49