关于C++智能指针类的问题,求C++大牛解答。
这是三个类typedefcharDataType;constDataTypedt='\0';classNode;classNodeUseCount{//Node类的智能计...
这是三个类
typedef char DataType;const DataType dt = '\0';class Node;
class NodeUseCount{//Node类的智能计数类private: friend class Node;//友元,让Node能够直接访问其私有成员 size_t use; Node *next; NodeUseCount(Node *p):next(p),use(1){} ~NodeUseCount() { delete next;}};
class Node{//节点类private: DataType data; NodeUseCount *pn;public: Node(DataType e = dt):pn( new NodeUseCount(NULL) ),data(e){} Node(const Node& rhs):data(rhs.data),pn(rhs.pn) {++pn->use;}//复制构造函数 Node& operator=(const Node&);//声明赋值操作符 DataType getData()const {return data;} Node*& getNext() {return pn->next;} void setData(DataType e){data = e;} void setNext(Node* next) {pn->next = next;} ~Node(){ if(--pn->use == 0)delete pn; }//析构函数};
Node& Node::operator=(const Node& rhs){//定义赋值操作符 ++rhs.pn->use; if(--pn->use == 0) delete pn; data = rhs.data; pn = rhs.pn; return *this;}
typedef class LinkList{//链表类private: Node *head; LinkList(const LinkList &); LinkList& operator=(const LinkList&);public: LinkList():head( new Node()){}//构造空链表 void create();//建立链表 void insert(DataType);//插入一个结点 void insert(DataType*,size_t,size_t);//插入一系列节点 void del(DataType e);//删除值为e的节点 //void del(Node &node);//删除node节点 void edit(DataType e,DataType ee);//将值为e的节点的值改为ee void find(DataType e,Node &node)const;//查找值为e的节点,并返回此节点 void print()const;//打印链表 void clear();//清空链表 ~LinkList();}list;
这是一张图片,每个圈圈是一个节点,next指针域放在了使用计数类对象里面。我想问,比如我要删除a节点时,可以看出使用计数use为1,可以释放空间,不用害怕会有悬垂指针,但是当析构函数删除next时是不是也会删除b节点,然后删除b又会引起删除c,最后全删掉了,会不会这样?如果会,可以怎么修改这个类,谢谢! 展开
typedef char DataType;const DataType dt = '\0';class Node;
class NodeUseCount{//Node类的智能计数类private: friend class Node;//友元,让Node能够直接访问其私有成员 size_t use; Node *next; NodeUseCount(Node *p):next(p),use(1){} ~NodeUseCount() { delete next;}};
class Node{//节点类private: DataType data; NodeUseCount *pn;public: Node(DataType e = dt):pn( new NodeUseCount(NULL) ),data(e){} Node(const Node& rhs):data(rhs.data),pn(rhs.pn) {++pn->use;}//复制构造函数 Node& operator=(const Node&);//声明赋值操作符 DataType getData()const {return data;} Node*& getNext() {return pn->next;} void setData(DataType e){data = e;} void setNext(Node* next) {pn->next = next;} ~Node(){ if(--pn->use == 0)delete pn; }//析构函数};
Node& Node::operator=(const Node& rhs){//定义赋值操作符 ++rhs.pn->use; if(--pn->use == 0) delete pn; data = rhs.data; pn = rhs.pn; return *this;}
typedef class LinkList{//链表类private: Node *head; LinkList(const LinkList &); LinkList& operator=(const LinkList&);public: LinkList():head( new Node()){}//构造空链表 void create();//建立链表 void insert(DataType);//插入一个结点 void insert(DataType*,size_t,size_t);//插入一系列节点 void del(DataType e);//删除值为e的节点 //void del(Node &node);//删除node节点 void edit(DataType e,DataType ee);//将值为e的节点的值改为ee void find(DataType e,Node &node)const;//查找值为e的节点,并返回此节点 void print()const;//打印链表 void clear();//清空链表 ~LinkList();}list;
这是一张图片,每个圈圈是一个节点,next指针域放在了使用计数类对象里面。我想问,比如我要删除a节点时,可以看出使用计数use为1,可以释放空间,不用害怕会有悬垂指针,但是当析构函数删除next时是不是也会删除b节点,然后删除b又会引起删除c,最后全删掉了,会不会这样?如果会,可以怎么修改这个类,谢谢! 展开
2个回答
展开全部
你为什么要弄一个NodeUseCount类呢,直接让Node类对一个use数据成员不就可以。如下所示:
template <class DataType>
class Node{
private:
DataType data;
size_t used;
Node *next;
public:
Node(DataType e = '\0'): data(e), used(1), next(NULL){}
...
};
更多追问追答
追问
如果用一个对象在多个地方初始化新创建的新对象,那么每一个对象都是这个对象的副本,对于每个副本的建立都需要同步更新use很困难也不方便。
追答
不清楚你的程序最终要实现什么?如果要统计创建了几个对象,那么每次new的时候,都在链表里相应地insert(DataType)不就可以,这样对应数据的used就会+1。销毁对象的时候,再从链表里把对应used减一。
再说,你这种Node节点后面紧跟一个NodeUseCount节点的结构,跟直接在Node里加一个used数据成员这两种是没有区别的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询