![]() |
#2
uouo992019-10-07 11:29
自己先优化一下吧,抛砖引玉~
主要优化两点: 1.operator[]函数和const版本的代码重复,现通过cast转型将前者调用后者的代码。 2.将指向数组的裸指针替换为智能指针数组,因此析构函数也不需要有了 优化后代码如下: ![]() #include <string> #include <iostream> #include <memory> using namespace std; template<typename T> class Array2D //表示二维数组的类 { public: class Array1D //表示一维数组的类 { public: T& operator[](int index) { return const_cast<T&>(static_cast<const Array1D&>(*this)[index]); } const T& operator[](int index) const { return arr1[index]; } auto& CreateArr1D(int nums) { arr1.reset(new T[nums]); return arr1; } //... private: unique_ptr<T[]> arr1{ nullptr }; }; Array2D(int dim1, int dim2) { arr2.reset(new Array1D[dim1]); for (int i = 0; i < dim1; i++) arr2[i].CreateArr1D(dim2); } Array1D& operator[](int index) { return const_cast<Array1D&>(static_cast<const Array2D&>(*this)[index]); } const Array1D& operator[](int index) const { return arr2[index]; } //... private: unique_ptr<Array1D[]> arr2{ nullptr }; }; //Test: int main() { Array2D<int> p(3,5); p[0][0] = 100; p[2][4] = 200; cout << p[0][0] << " " << p[2][4] << endl; } |
因为C++不直接支持二维数组,例如int a[8][10];是可以的,但是int dim1 = 8; int dim2 = 10; int a[dim1][dim2];却不可以,所以自定义了一个二维数组类,方便动态创建二维数组。
学习C++过程中参考某书学习并写下的一个二维数组雏形类,求bug修正和完善,谢谢。。。

#include <string>
#include <iostream>
using namespace std;
template<typename T>
class Array2D //表示二维数组的类
{
public:
class Array1D //表示一维数组的类
{
public:
T& operator[](int index)
{
return arr1[index];
}
const T& operator[](int index) const
{
return arr1[index];
}
T* CreateArr1D(int nums)
{
arr1 = new T[nums];
return arr1;
}
~Array1D()
{
delete[] arr1;
}
//...
private:
T* arr1 = nullptr;
};
Array2D(int dim1, int dim2)
{
arr2 = new Array1D[dim1];
for (int i = 0; i < dim1; i++)
arr2[i].CreateArr1D(dim2);
}
Array1D& operator[](int index)
{
return arr2[index];
}
const Array1D& operator[](int index) const
{
return arr2[index];
}
~Array2D()
{
delete[] arr2;
}
//...
private:
Array1D* arr2;
};
//Test:
int main()
{
Array2D<int> p(3,5);
p[0][0] = 100;
p[2][4] = 200;
cout << p[0][0] << " " << p[2][4] << endl;
}
#include <iostream>
using namespace std;
template<typename T>
class Array2D //表示二维数组的类
{
public:
class Array1D //表示一维数组的类
{
public:
T& operator[](int index)
{
return arr1[index];
}
const T& operator[](int index) const
{
return arr1[index];
}
T* CreateArr1D(int nums)
{
arr1 = new T[nums];
return arr1;
}
~Array1D()
{
delete[] arr1;
}
//...
private:
T* arr1 = nullptr;
};
Array2D(int dim1, int dim2)
{
arr2 = new Array1D[dim1];
for (int i = 0; i < dim1; i++)
arr2[i].CreateArr1D(dim2);
}
Array1D& operator[](int index)
{
return arr2[index];
}
const Array1D& operator[](int index) const
{
return arr2[index];
}
~Array2D()
{
delete[] arr2;
}
//...
private:
Array1D* arr2;
};
//Test:
int main()
{
Array2D<int> p(3,5);
p[0][0] = 100;
p[2][4] = 200;
cout << p[0][0] << " " << p[2][4] << endl;
}