新手请教个智能指针重载的问题
运行到重载这一步就崩溃了...恳请各位前辈指点一下
// 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 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;}