| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 688 人关注过本帖
标题:关于复制控制
只看楼主 加入收藏
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
结帖率:92.86%
收藏
 问题点数:0 回复次数:10 
关于复制控制
程序代码:
class U_ptr
{
    friend class Hasptr;
    int*ip;
    size_t use;
    
    U_ptr(int * p):ip(p),use(1){}
    ~U_ptr(void){ delete ip;}
};
class U_ptr;

class Hasptr
{
public:
    //constructor
    Hasptr(int* p,int i):ptr(new U_ptr(p),val(0){}     //1.智能指针的计数类使用,只是在复制和赋值时起作用啊,如果不通过复制和赋值,只是通过定义时传的指针p值相同,那这个计数器没变,仍能产生悬垂指针的危险啊
    //copy
    Hasptr(const Hasptr& p):ptr(p.ptr),val(p.val){++ptr->use;}
    //assignment operator
    Hasptr& operator=(const Hasptr&);
    //destructor  
    ~Hasptr(void)
    {
        if(--ptr->use==0)
            delete ptr;
    }
    //get element
    int* get_ptr(){  return ptr->ip;}
    int get_int(){   return val;}
    // change the appropriate data nember
    void set_ptr(int * p){ ptr->ip=p; }   //2.这里修改了ip,那use不应该改一下吗?应该和其他ip值相同的其他ptr的use保持一致吗?同时原ip的ptr的use不应该减一吗?
    void set_int(int i){val=i;}
    //return or change the value pointed to 
    int get_ptr_val()const {return *ptr->ip;}
    void set_ptr_val(int i){ *ptr->ip=i;

private:
    U_ptr* ptr;
    int val;
}

3.书上说没使用计数时,析构函数用来删除指针成员,那撤销一个Hasptr时会删除其指针对象,其他由该对象复制创建的对象的指针成员将无法使用,因为  指针成员所指的对象已被撤销。
是不是这个意思:      不加析构函数时,编译器会调用一个合成析构函数,该合成的函数只会把指针所用的空间释放,而其所指对象的空间没有被释放;自己加的析构函数应为:~Hasptr(void)
    {
        
            delete ptr;
    }
而用delete时就把指针所指对象的空间也释放了?
“析构函数撤销复合类型”的复合类型是指?
4.a复制构造函数,b析构函数,c定义赋值操作符,三者只要有一个没定义,则如由对象Hasptr  A复制赋值而来的对像B,会在A被删除后,其基础的int对象无法访问,且没被撤销
按照2.的说法我能理解没有b会这样,可没a,b怎么也这样?
程序代码:
class TreeNode{
public:
   TreeNode():count(0){}
   TreeNode(const TreeNode&);
   ~TreeNode();
private:
   string value;
    int count;
    TreeNode l;
   TreeNode r;
}
   

5.上面是书上的一个例子,为什么operator=的定义?
谢谢
搜索更多相关主题的帖子: 复制 
2012-08-23 18:00
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
收藏
得分:0 
此外,生成时出现如图error不知怎么回事?
图片附件: 游客没有浏览图片的权限,请 登录注册
2012-08-23 18:06
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
哎。。什么啊,今天说std出问题的次数好多啊?为什么
2012-08-23 19:46
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
回复 3楼 humy
我没用过std::set容器,不过看的两个:号都分开了,原本还以为是全角字符。

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-08-23 20:15
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
LZ看的是什么书,你的理解偏差还挺大的,如果你有C的基础的话,不如看看C++ Primer或Thinking in C++试试?

My life is brilliant
2012-08-23 20:31
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
楼主真是问题妹妹呀。问题问得都还挺难答。
2012-08-24 02:58
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
收藏
得分:0 
回复 5楼 lz1091914999
有c 语言基础,真是在看C++ Primer。。。。我问的问题都是看书时想的。。现在到了后几章,觉的真的深奥了许多。。。有偏差的话,应该是我的问题。。不是书,
2012-08-25 17:12
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
收藏
得分:0 
回复 6楼 pangding
呵呵呵,没办法。。。随便看看,脑子里就有疑问。。。还要多些大家帮忙了。。。
2012-08-25 17:15
BianChengNan
Rank: 8Rank: 8
等 级:贵宾
威 望:13
帖 子:302
专家分:972
注 册:2011-11-30
收藏
得分:0 
以下是引用humy在2012-8-23 18:00:04的发言:

class U_ptr
{
    friend class Hasptr;
    int*ip;
    size_t use;
     
    U_ptr(int * p):ip(p),use(1){}
    ~U_ptr(void){ delete ip;}
};
class U_ptr;
 
class Hasptr
{
public:
    //constructor
    Hasptr(int* p,int i):ptr(new U_ptr(p),val(0){}     //1.智能指针的计数类使用,只是在复制和赋值时起作用啊,如果不通过复制和赋值,只是通过定义时传的指针p值相同,那这个计数器没变,仍能产生悬垂指针的危险啊
    //copy
    Hasptr(const Hasptr& p):ptr(p.ptr),val(p.val){++ptr->use;}
    //assignment operator
    Hasptr& operator=(const Hasptr&);
    //destructor   
    ~Hasptr(void)
    {
        if(--ptr->use==0)
            delete ptr;
    }
    //get element
    int* get_ptr(){  return ptr->ip;}
    int get_int(){   return val;}
    // change the appropriate data nember
    void set_ptr(int * p){ ptr->ip=p; }   //2.这里修改了ip,那use不应该改一下吗?应该和其他ip值相同的其他ptr的use保持一致吗?同时原ip的ptr的use不应该减一吗?
    void set_int(int i){val=i;}
    //return or change the value pointed to  
    int get_ptr_val()const {return *ptr->ip;}
    void set_ptr_val(int i){ *ptr->ip=i;
 
private:
    U_ptr* ptr;
    int val;
}
 
3.书上说没使用计数时,析构函数用来删除指针成员,那撤销一个Hasptr时会删除其指针对象,其他由该对象复制创建的对象的指针成员将无法使用,因为  指针成员所指的对象已被撤销。
是不是这个意思:      不加析构函数时,编译器会调用一个合成析构函数,该合成的函数只会把指针所用的空间释放,而其所指对象的空间没有被释放;自己加的析构函数应为:~Hasptr(void)
    {
         
            delete ptr;
    }
而用delete时就把指针所指对象的空间也释放了?
“析构函数撤销复合类型”的复合类型是指?
4.a复制构造函数,b析构函数,c定义赋值操作符,三者只要有一个没定义,则如由对象Hasptr  A复制赋值而来的对像B,会在A被删除后,其基础的int对象无法访问,且没被撤销
按照2.的说法我能理解没有b会这样,可没a,b怎么也这样?
class TreeNode{
public:
   TreeNode():count(0){}
   TreeNode(const TreeNode&);
   ~TreeNode();
private:
   string value;
    int count;
    TreeNode l;
   TreeNode r;
}
   
5.上面是书上的一个例子,为什么operator=的定义?
谢谢
我就特想知道楼主这例子哪来的?C++ Primer上的?我看着像,但是貌似和源码不一样。还请指教

我的群:149544757 C/C++/Assembly 喜欢交流的朋友进,进群请写消息
2012-08-27 16:40
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
收藏
得分:0 
回复 9楼 BianChengNan
真的是书上的。。。。
2012-08-27 22:45
快速回复:关于复制控制
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027567 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved