是关于一个容器管理很多类的问题。。。。。
primer中提到用智能指针来解决, 容器存放智能指针。。
于是我写了一个简单的智能指针类
不知道如何完善下去了。。。。
Base是基类,Derived是继承类,MySmartPtr是智能指针类
如何给MySmartPtr中的指针成员进行分配内存啊??
代码如下:
class Base
{
//构造和析构
public:
Base():data(0){}
~Base(){}
//interface member funciton
public:
void Print() const
{
cout<<data;
}
//data
private:
int data;
//other member funciton
public:
//返回该对象的副本
virtual Base* clone() const
{
return new Base(*this);
}
};
class Derived:public Base
{
public:
//返回该对象的副本
Derived* clone() const
{
return new Derived(*this);
}
};
//智能指针类
class MySmartPtr
{
private:
Base* p;
size_t * use;
private:
void decr_use()
{
if ( (-- *use)==0 )
{
delete p;
delete use;
}
}
public:
MySmartPtr():p(NULL),use(new size_t(1)){}
~MySmartPtr()
{
decr_use();
}
const Base* operator->() const throw (logic_error)
{
if(p)
return p;
else
throw logic_error(string("空指针"));
}
};
1. MySmartPtr提供的借口 -> ,是获得其成员指针, 首先得保证p已经指向一块内存,才能使用, 要指向内存,需要分配内存啊,,
怎么给成员p分配内存。。。。。。。
2. 用容器管理 很多类, 智能指针类,真的可行吗???
8 个解决方案
#1
1.
p = new Base();
2.
没用过, 无法断言
p = new Base();
2.
没用过, 无法断言
#2
不能直接这样分配内存
MySmartPtr已经把那个指针设置为私有,
使用里面的那个指针,只能通过->运算符
使用运算符之前,又必须分配内存
我矛盾了
MySmartPtr已经把那个指针设置为私有,
使用里面的那个指针,只能通过->运算符
使用运算符之前,又必须分配内存
我矛盾了
#3
木有人啊
#4
1 智能指针类中只保存 要维护资源的 句柄。
所以p一般通过构造函数或其他成员函数,来设置p的值。
参考c++iso2003 auto_ptr类的源码
所以p一般通过构造函数或其他成员函数,来设置p的值。
参考c++iso2003 auto_ptr类的源码
#5
2 可以 有很多现场智能指针可以使用 如:unique_ptr
#6
多谢, 我觉得从 构造函数中穿进去较为合适一些,
#7
私有对象赋值那就自身调用呗~只要是成员函数或者友元都可以~智能指针一般使用构造函数然后再析构里面释放掉~
至于第二个问题~标准库函数已经解决的差不多了~
至于第二个问题~标准库函数已经解决的差不多了~
#8
不要自己写智能指针,用std::unique_ptr。
#1
1.
p = new Base();
2.
没用过, 无法断言
p = new Base();
2.
没用过, 无法断言
#2
不能直接这样分配内存
MySmartPtr已经把那个指针设置为私有,
使用里面的那个指针,只能通过->运算符
使用运算符之前,又必须分配内存
我矛盾了
MySmartPtr已经把那个指针设置为私有,
使用里面的那个指针,只能通过->运算符
使用运算符之前,又必须分配内存
我矛盾了
#3
木有人啊
#4
1 智能指针类中只保存 要维护资源的 句柄。
所以p一般通过构造函数或其他成员函数,来设置p的值。
参考c++iso2003 auto_ptr类的源码
所以p一般通过构造函数或其他成员函数,来设置p的值。
参考c++iso2003 auto_ptr类的源码
#5
2 可以 有很多现场智能指针可以使用 如:unique_ptr
#6
多谢, 我觉得从 构造函数中穿进去较为合适一些,
#7
私有对象赋值那就自身调用呗~只要是成员函数或者友元都可以~智能指针一般使用构造函数然后再析构里面释放掉~
至于第二个问题~标准库函数已经解决的差不多了~
至于第二个问题~标准库函数已经解决的差不多了~
#8
不要自己写智能指针,用std::unique_ptr。