首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

新手请问个智能指针重载的有关问题

2012-05-24 
新手请教个智能指针重载的问题运行到重载这一步就崩溃了...恳请各位前辈指点一下C/C++ code// a.cpp : 定

新手请教个智能指针重载的问题
运行到重载这一步就崩溃了...恳请各位前辈指点一下

C/C++ code
// a.cpp : 定义控制台应用程序的入口点。////#include "stdafx.h"#include"iostream"#include"conio.h"using namespace std;class HasPtr;HasPtr operator+(const HasPtr &name1,const HasPtr &name2);class U_Ptr{private:    friend class HasPtr;    friend HasPtr operator+(const HasPtr &name1,const HasPtr &name2);//友元没有传递性,所以要再次声明友元    int *p;    size_t use;    U_Ptr(int *s):p(s),use(1){}    ~U_Ptr(){delete p;}};HasPtr operator+(const HasPtr &name1,const HasPtr &name2);class HasPtr{private:    U_Ptr *ptr;    int val;    friend ostream& operator<<(ostream &os,const  HasPtr &object);    void display1() const {cout<<*(ptr->p)<<ptr->use;}public:    HasPtr(int *p,int i):val(i),ptr(new U_Ptr(p)){}    HasPtr(){}//只有在没有提供构造函数时编译器才会替类提供默认无参构造函数,由于上面已经有构造函数了,所以必须显式定义    HasPtr(const HasPtr &orig):val(orig.val),ptr(orig.ptr){++ptr->use;}    ~HasPtr(){if(--ptr->use==0) delete ptr;}    friend HasPtr operator+(const HasPtr &name1,const HasPtr &name2);    int *get_ptr()const{return ptr->p;}    int get_int()const{return val;}    int  get_ptr(){return *ptr->p;}    void set_ptr(int *p){ptr->p=p;}    void set_int(int i){val=i;}        void display2() const{ display1(); }                };int main(){    int *n=new int(5);    HasPtr name1(n,3);    cout<<name1;    HasPtr name2;    name1.display2();    name2=name1+name1;    cout<<name2;    getch();    return 0;    }ostream& operator<<(ostream &os,const  HasPtr &object){os<<object.val<<endl;return os;}//friend 关键字用外联定义时候必须去掉HasPtr operator+(const HasPtr &name1,const HasPtr &name2){    HasPtr name;    name.val=name1.val+name2.val;    *(name.ptr->p)=(*(name1.ptr->p)+*(name2.ptr->p));    return name;}


[解决办法]
HasPtr name; 默认构造函数没有ptr(new U_Ptr(p))没有对积累指针new分配空间
[解决办法]
C/C++ code
HasPtr operator+(const HasPtr &name1,const HasPtr &name2){    HasPtr name;//默认构造,但是指针是个未初始化的指针    name.val=name1.val+name2.val;    *(name.ptr->p)=(*(name1.ptr->p)+*(name2.ptr->p));//调用指针来执行,错误在此。    return name;} 

热点排行