照着C++ Primer一书上的智能指针实现了下。结果发现编译一直通不过。
后来发现原来被声明为友元类的类要放在声明友元类的后面在VS2012上才能通过。
#ifndef SMART_POINT_H_
#define SMART_POINT_H_
class U_Ptr
{
private:
friend class HasPtr;
int* ip;
size_t use;
U_Ptr(int* p ):ip(p), use(1){ }
~U_Ptr(){ delete ip; }
};
class HasPtr
{
public:
HasPtr(int* p, int i ):ptr(new U_Ptr(p) ),val(i){ }
HasPtr(const HasPtr& orig):ptr( orig.ptr ), val( orig.val ) { ++(ptr->use); }
HasPtr& operator= ( const HasPtr&orig )
{
++(orig.ptr->use);
if( --(ptr->use) == 0)
deleteptr;
ptr =orig.ptr;
val =orig.val;
return *this;
}
~HasPtr(){ if( (--(ptr->use)) == 0 ) delete ptr; }
int* get_ptr() const{ return ptr->ip; }
int get_int() const{ return val; }
void set_ptr( int* p ){ ptr->ip = p; }
void set_int(inti ){ val =i; }
int get_ptr_val() const{ return *(ptr->ip); }
void set_ptr_val( int val ) const { *(ptr->ip) = val; }
private:
U_Ptr* ptr;
int val;
};
#endif