关于c++类中的指针成员问题

C++类中指针成员的管理:

 

有三种解决方案:

      1.全部用值类型指针:

           优点:可以很安全而且简单。

           缺点:占用大量的内存,并且内存CPY运算量巨大。

           方法:写如下几个函数:

                    复制构造函数。

                    析构函数。

                    赋值控制函数。

      2.全部用指针类型:

          优点:简单而且高效。

          缺点:很复杂。

          方法:构造智能指针。

      3.常规的指针:

          优点:复杂而且高效

          缺点:需要程序员手动管理他们行为,具有指针的所有缺陷,从而造成编程困难。   

                   因为,不仅要检查对象的delete,而且要检查成员指针的delete是否该执行。      

这三种方案如果都被用在项目上,那么,我们该如何做。

       1.如果是值类型,就不用去管理。

       2.如果是智能指针类型,也不用去管理。

       3.如果是常规类型,那么就需要去查看它的成员指针,看它的成员指针是什么类型。然后递归地查找。转3.

第三种方案万万用不得。。。。。。。。。。。。。

 

最好的是第二种:

 

     方法是保留一个对象中指针的使用计数。算法:

 

1.if(赋值操作)

     『

         if(自己的指针需要delete)

         那么delete掉;

         复制各个成员过来。

         指针成员的使用计数+1;

      』

      if(复制构造)

     『

            计数++;

     』

2.else  if(析构)

      『

          计数-1;

          if(计数为0)delete;

       』

3.if(其他构造)

     『

         构造智能指针对象,并且计数为1;

         如果不构造指针对象,那么计数为0;

       』

       这样,每次在析构的时候,都在询问:      

       我这个指针成员的副本有几个?

      

 

用指针NULL表示有0个副本,为1表示1个副本。。。。总结为一句话:

 

     思想:在delete某个对象的时候,进行询问:

 

             是否这个对象的指针成员需要delete?

 

     

 

 

 

 

 

       

                  

        

 

展开阅读全文

c++链表中关于私有指针成员问题

07-16

[code=c]templaternclass Listrn private:rn class Nodern public:rn T m_data;rn Node* m_prev;rn Node* m_next;rn Node(const T& data,Node* prev = NULL,Node* next = NULL):m_data(data),m_prev(prev),m_next(next)rn friend ostream& operator<<(ostream& os,Node node)rn return os<< '[' << node.m_data << ']';rn rn ;rn Node* m_head;rn Node* m_tail;rn public:rn List(void):m_head(NULL), m_tail(NULL)rn ~List(void)rn clear();rn rn List(const List& that):m_head(NULL), m_tail(NULL)rn for(Node* node = that.m_head;node;node=node->m_next)rn push_back(node->m_data);rn rn List& operator=(const List& that)rn if(&that != this)rn List list(that);rn swap(m_head,list.m_head);rn swap(m_tail,list.m_tail);rn rn return *thisrn rn T& front(void)rn return m_head->m_data;rn rn const T& front(void)constrn return const_cast(this)->front();rn rn List& push_front(const T& data)rn m_head=new Node(data,NULL,m_head);rn if(m_head->m_next)rn m_head->m_next->m_prev=m_head;rn elsern m_tail=m_head;rn rn return *this;rn rn List& pop_front(void)rn Node* node=m_head->m_next;rn delete m_head;rn m_head=node;rn if(m_head)rn m_head->m_next->m_prev=NULL;rn elsern m_tail=NULL;rn rn return *this;rn rn T& back(void)rn return m_tail->m_data;rn rn const T& back(void)constrn return const_cast(this)->back();rn rn List& push_back(const T& data)rn m_tail=new Node(data,m_tail,NULL);rn if(m_tail->m_prev)rn m_tail->m_prev->m_next=m_tail;rn elsern m_head=m_tail;rn rn return *this;rn rn List& pop_back(void)rn Node* node=m_tail->m_prev;rn delete m_tail;rn m_tail=node;rn if(m_tail)rn m_tail->m_prev->m_next = m_tail;rn elsern m_head=NULL;rn rn return *this;rn rn void remove(const T& data)rn for(Node* node=m_head,*next;node;node=next)rn next=node->m_next;rn if(data == node->m_data)rn if(node->m_prev)rn node->m_prev->m_next=node->m_next;rn node->m_next->m_prev=node->m_prev;rn elsern m_head=node->m_next;rn rn if(node->m_next)rn node->m_next->m_prev=node->m_prev;rn node->m_prev->m_next=node->m_next;rn elsern m_tail=node->m_prev;rn rn delete node;rn rn rn rn void clear(void)rn for(Node* next; m_head;m_head=next)rn next=m_head->m_next;rn delete m_head;rn rn m_tail=NULL;rn rn bool empty(void)constrn return m_head == m_tail;rn rn size_t size(void)constrn int counter=0;rn for(Node* node=m_head;node;node=node->next)rn counter++;rn rn return counter;rn rn friend ostream& operator<<(const List& list)rn os << *(list.m_head);rn return os;rn rnrnrn;[/code]rnrn各位大大:rn链表内部私有node为什么可以在外部可以访问?rn例如rnList(const List& that):m_head(NULL), m_tail(NULL)rn for(Node* node = that.m_head;node;node=node->m_next)rn push_back(node->m_data);rn rn这个拷贝构造函数,不是私有成员一般都不能外部访问?求解 论坛

没有更多推荐了,返回首页