用类模板实现C++智能指针

本文探讨了一段关于autoPtr模板类的错误代码,详细分析了构造函数中因命名冲突导致的问题,并提供了修复方案。通过调整构造函数内部对指针的引用方式,解决了原本覆盖类中私有指针成员的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

首先是一段错误的代码

#include<iostream>

using namespace std;

template<class T>
class autoPtr {
public:
	//构造函数,创建一个T类型的指针并赋值n
	autoPtr(T n)
	{
		T *ptr = new T;
		*ptr = n;
		cout << "new pointer created." << endl;
		cout << *ptr << endl; //这个地方可以输出ptr指向的值
	}
	//构造函数
	autoPtr() {};
	//析构函数
	~autoPtr()
	{
		delete ptr;
		cout << "pointer destroyed." << endl;
	}
	//用这个函数来输出ptr指向的值
	void show()
	{
		cout << *ptr << endl;//这个地方不能输出,内存无法读取
		cout << "That is the value of ptr." << endl;
	}
private:
	T* ptr;
};

int main()
{
	autoPtr<int> pt(5);
	pt.show();

	return 0;
}

VS2017报错

ptr为什么是个nullptr呢,明明在构造函数中都给ptr赋值了。

看了好久,才发现tmd是namespace出了问题,在构造函数中new出来了一个ptr,覆盖了类中private的ptr。

这个时候把构造函数稍作修改,

//构造函数,创建一个T类型的指针并赋值n
	autoPtr(T n)
	{
		ptr = new T;//去掉T*,直接用Private里T*好的ptr
		*ptr = n;
		cout << "new pointer created." << endl;
		cout << *ptr << endl; //这个地方可以输出ptr指向的值
	}

这个时候,程序就能愉快的运行啦! 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值