Schrieffer.zsy 2021-02-15 12:42 采纳率: 93.8%
浏览 171
已采纳

定义一个指针作为数组的首地址,怎样求出它的size?

#include<iostream>
using namespace std;

template<class T>
class SelfDefinedArr
{
private:
	int m_Size;
	int Maximum;
	T* Ptr_Arr;
public:
	SelfDefinedArr(int max)
	{
		m_Size = 0;
		Maximum = max;
		Ptr_Arr = new T[max];
	}
	SelfDefinedArr(const SelfDefinedArr& sda)
	{
		m_Size = sda.m_Size;
		Maximum = sda.Maximum;
		Ptr_Arr = new T[sda.Maximum];//申请一段以Ptr_Arr为首地址的连续的堆空间
		for (int i = 0; i < sda.m_Size; i++)
		{
			Ptr_Arr[i] = sda.Ptr_Arr[i];
		}	
	}
	SelfDefinedArr& operator=(SelfDefinedArr& arr)
	{	
		if (Ptr_Arr != NULL)
		{
			delete[] Ptr_Arr;
			Ptr_Arr = NULL;
		}
		m_Size = arr.m_Size;
		Maximum = arr.Maximum;
		Ptr_Arr = new T[arr.Maximum];
		for (int i = 0; i < arr.m_Size; i++)
		{
			Ptr_Arr[i] = arr.Ptr_Arr[i];
		}
		return *this;
	}
	int GetMaximum()
	{
		return Maximum;
	}
	int GetSize()
	{
		int Amount = 0;
		T arr[] = Ptr_Arr[];
		Amount = sizeof(arr) / sizeof(T);
		return Amount;
	}

	T& operator[](int a)
	{
		return Ptr_Arr[a];
	}

	void Add(T a)
	{
		if (m_Size >= Maximum)
		{
			cout << "数组已满" << endl;
			return;
		}
		Ptr_Arr[m_Size] = a;
		m_Size++;
	}
	void Delete()
	{
		if (m_Size = 0)
		{
			cout << "无法尾删空数组" << endl;
			return;
		}
		m_Size--;
	}
	~SelfDefinedArr()
	{
		if (Ptr_Arr != NULL)
		{
			delete[] Ptr_Arr;
			Ptr_Arr = NULL;
		}
	}
};

void test01()
{
	SelfDefinedArr<double> arr(5);
	for (int i = 0; i < 4; i++)
	{
		arr.Add(3.14 + i);
	}
	cout << "数组的长度为:" << arr.GetSize() << endl;
	cout << "数组的容量为:" << arr.GetMaximum() << endl;
}







int main()
{
	test01();
	system("pause");
	return 0;
}
  • 写回答

2条回答 默认 最新

  • ProfSnail 2021-02-15 12:46
    关注

    根据题主的代码,应该是题目要求实现一个类似vector的容器吧。其实只有一个数组的首地址,是无法实现计算容器的大小的,维护容量并不超过限制,在C语言是交由程序员判断的。题主只需要再维护一个数组的结尾地址就可以实现计算容器大小的要求了。

    比如:

    T* Arr_End;

    在计算容量大小的时候,就使用:

    Amount = Arr_End - Ptr_Arr + 1;

    即可。

     

    如果不是一定要用指针计算容量,那么既然已经在添加和删除节点的时候维护了m_Size的数值,只需要在GetSize()的时候返回m_Size即可。

    int GetSize()
    {
    	return m_Size;
    }
    

    此外,由于定义时候将m_Size, Maximum定义为了private,从其他SelfDefinedArr对象构建本对象的时候,就不能调用arr.m_Size了,而是调用公共函数arr.GetSize();从其他SelfDefinedArr对象构建本对象的时候,也需要注意不要使用const修饰符,防止方法不能正常调用。总修改如下:

    #include<iostream>
    using namespace std;
    
    template<class T>
    class SelfDefinedArr
    {
    private:
    	int m_Size;
    	int Maximum;
    	T* Ptr_Arr, *ArrEnd;
    
    public:
    	SelfDefinedArr() {}//无参数的默认构造函数。
    	SelfDefinedArr(int max)
    	{
    		m_Size = 0;
    		Maximum = max;
    		Ptr_Arr = new T[max];
    		ArrEnd = Ptr_Arr + max;
    	}
    	SelfDefinedArr(SelfDefinedArr& sda)
    	{
    		m_Size = sda.GetSize();
    		Maximum = sda.GetMaximum();
    		Ptr_Arr = new T[m_Size];//申请一段以Ptr_Arr为首地址的连续的堆空间
    		for (int i = 0; i < m_Size; i++)
    		{
    			Ptr_Arr[i] = sda.Ptr_Arr[i];
    		}
    	}
    	SelfDefinedArr& operator=(SelfDefinedArr& arr)
    	{
    		if (Ptr_Arr != NULL)
    		{
    			delete[] Ptr_Arr;
    			Ptr_Arr = NULL;
    		}
    		m_Size = arr.GetSize();
    		Maximum = arr.GetMaximum();
    		Ptr_Arr = new T[m_Size];
    		for (int i = 0; i < m_Size; i++)
    		{
    			Ptr_Arr[i] = arr.Ptr_Arr[i];
    		}
    		return *this;
    	}
    	int GetMaximum()
    	{
    		return Maximum;
    	}
    	int GetSize()
    	{
    		return m_Size;
    	}
    
    	T& operator[](int a)
    	{
    		return Ptr_Arr[a];
    	}
    
    	void Add(T a)
    	{
    		if (m_Size >= Maximum)
    		{
    			cout << "数组已满" << endl;
    			return;
    		}
    		Ptr_Arr[m_Size] = a;
    		m_Size++;
    	}
    	void Delete()
    	{
    		if (m_Size = 0)
    		{
    			cout << "无法尾删空数组" << endl;
    			return;
    		}
    		m_Size--;
    	}
    	~SelfDefinedArr()
    	{
    		if (Ptr_Arr != NULL)
    		{
    			delete[] Ptr_Arr;
    			Ptr_Arr = NULL;
    		}
    	}
    };
    
    void test01()
    {
    	SelfDefinedArr<double> arr(5);
    	for (int i = 0; i < 4; i++)
    	{
    		arr.Add(3.14 + i);
    	}
    	cout << "数组的长度为:" << arr.GetSize() << endl;
    	cout << "数组的容量为:" << arr.GetMaximum() << endl;
    
    	SelfDefinedArr<double> another(arr);
    	cout << "从arr构建的长度为:" << another.GetSize() << endl;
    	cout << "从arr构建的容量为:" << another.GetMaximum() << endl;
    
    	SelfDefinedArr<double> last;
    	last = another;
    	cout << "从=赋值构建的长度为:" << last.GetSize() << endl;
    	cout << "从=赋值构建的容量为:" << last.GetMaximum() << endl;
    
    }
    
    int main()
    {
    	test01();
    	system("pause");
    	return 0;
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 pb数据库修改或者求完整pb库存系统,需为pb自带数据库
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路