模板类数组和指针数组如何初始化?

未狂 2020-10-16 03:47:25

template<class T>
class Moudle
{
public:
Moudle(int param);
}

template<class T>
Moudle::Moudle(int param)
{
std::cout<<param;
}


简单的初始化都没问题

Moudle<int> a(15);
Moudle<int> *b=new Moudle<int>(15);

上面两种初始化都没问题

但如果是数组或者数组指针,该怎么非隐式初始化?比如数组、指针数组元素10个

Moudle<int> c[10];
Moudle<int> (*d)[10];


我用下面的方式初始化,想把初试参数15放进去,都不对。自己把自己绕晕了

Moudle<int> c[10](15)

for(int i=0;i<10;i++)
d[i]=new Moudle<int>(15);
...全文
425 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-08
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
未狂 2020-10-18
  • 打赏
  • 举报
回复
我用模板类做指针数组,不是想搞二维数组,是想用一个数组来存模板类的对象指针……
引用 5 楼 uouo88 的回复:

using namespace std;


template<typename T>
class Array2D  //表示二维数组的类
{
public:
	class Array1D  //表示一维数组的类
	{
	public:
		Array1D() = default;
		T& operator[](size_t index)
		{
			return const_cast<T&>(static_cast<const Array1D&>(*this)[index]);
		}
		const T& operator[](size_t index) const
		{
			return arr1[index];
		}
		auto& CreateArr1D(size_t nums)
		{
			arr1.reset(new T[nums]);
			return arr1;
		}
		Array1D(const Array1D&) = delete;
		Array1D& operator=(const Array1D&) = delete;
		//...
	private:
		unique_ptr<T[]> arr1{ nullptr };
	};
	Array2D(size_t dim1, size_t dim2, initializer_list<T> il = {})
	{
		arr2.reset(new Array1D[dim1]);
		for (size_t i = 0; i < dim1; i++)
			arr2[i].CreateArr1D(dim2);
		//initializer array value
		size_t num =  il.size();
		if (num > 0)
		{
			int i = 0;
			for (auto p = il.begin(); p != il.end(); ++p)
			{
				i++;
				arr2[((i - 1) / dim2) % dim1][(i - 1) % dim2] = *p;
			}
		}		
	}
	Array1D& operator[](size_t index)
	{
		return const_cast<Array1D&>(static_cast<const Array2D&>(*this)[index]);
	}
	const Array1D& operator[](size_t index) const
	{
		return arr2[index];
	}
	Array2D(const Array2D&) = delete;
	Array2D& operator=(const Array2D&) = delete;
	//...
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;

	Array2D<int> p2(3, 5, {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15});//传入初始值
	cout << p2[0][0] << " " << p2[2][4] << endl;

	Array2D<string> s(2, 2, {"abc","def"});
	cout << s[0][0] << " " << s[0][1] << " "  << s[1][0] << " " << s[1][1] << endl;
}
uouo88 2020-10-18
  • 打赏
  • 举报
回复
我知道你说的什么了,你那个错只要把小括号改成大括号就行了,因为你是数组,是一组元素初始化,而不是一个元素,所以你用小括号是不对的。 改成下面这样: Moudle<int> c[10]{15}; //初始化第一个元素,其余默认初始化 Moudle<int>(*d)[10]{&c }; //初始化数组的指针,这里可以传入c的数组地址 注意:上面第一种情况你必须提供一个不带参的构造方法,不然会调用失败,也就是在你的模板类public里加上下面这句: Moudle() = default;
uouo88 2020-10-18
  • 打赏
  • 举报
回复
是想用一个数组来存模板类的对象指针…… 不就是给你实现的这个么,二维数组都有了,你要一维的把Array1D抽出来就行了啊
uouo88 2020-10-17
  • 打赏
  • 举报
回复
uouo88 2020-10-17
  • 打赏
  • 举报
回复

using namespace std;


template<typename T>
class Array2D  //表示二维数组的类
{
public:
	class Array1D  //表示一维数组的类
	{
	public:
		Array1D() = default;
		T& operator[](size_t index)
		{
			return const_cast<T&>(static_cast<const Array1D&>(*this)[index]);
		}
		const T& operator[](size_t index) const
		{
			return arr1[index];
		}
		auto& CreateArr1D(size_t nums)
		{
			arr1.reset(new T[nums]);
			return arr1;
		}
		Array1D(const Array1D&) = delete;
		Array1D& operator=(const Array1D&) = delete;
		//...
	private:
		unique_ptr<T[]> arr1{ nullptr };
	};
	Array2D(size_t dim1, size_t dim2, initializer_list<T> il = {})
	{
		arr2.reset(new Array1D[dim1]);
		for (size_t i = 0; i < dim1; i++)
			arr2[i].CreateArr1D(dim2);
		//initializer array value
		size_t num =  il.size();
		if (num > 0)
		{
			int i = 0;
			for (auto p = il.begin(); p != il.end(); ++p)
			{
				i++;
				arr2[((i - 1) / dim2) % dim1][(i - 1) % dim2] = *p;
			}
		}		
	}
	Array1D& operator[](size_t index)
	{
		return const_cast<Array1D&>(static_cast<const Array2D&>(*this)[index]);
	}
	const Array1D& operator[](size_t index) const
	{
		return arr2[index];
	}
	Array2D(const Array2D&) = delete;
	Array2D& operator=(const Array2D&) = delete;
	//...
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;

	Array2D<int> p2(3, 5, {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15});//传入初始值
	cout << p2[0][0] << " " << p2[2][4] << endl;

	Array2D<string> s(2, 2, {"abc","def"});
	cout << s[0][0] << " " << s[0][1] << " "  << s[1][0] << " " << s[1][1] << endl;
}

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧