照着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)
delete
ptr;
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(
int
i )
{
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