定义一个指针作为数组的首地址,怎样求出它的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;
}

 

根据题主的代码,应该是题目要求实现一个类似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;
}

 

#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;
		Amount = m_Size;
		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;
}

你用这段代码试试,我看了你代码中有记录size的变量,直接进行输出就可以了,不需要在进行额外的计算了