.


:




:

































 

 

 

 


smart-




, new, , delete. , , , .

template <typename T>

struct Status { T *RealPtr; int Count;

};

template <typename T>

class Point

{ Status <T> *StatPtr;

Public:

Point (T * ptr = 0);

Point(const Point &);

~Point();

Point & operator =(const Point &);

T * operator->() const;

T & operator*() const;

void get_count() {cout<<StatPtr->Count<<endl;}

};

template<typename T>

Point<T>::Point(T * ptr)

{ if(!ptr)

StatPtr = NULL;

else

{ StatPtr = new Status <T>; StatPtr->RealPtr=ptr; StatPtr->Count = 1;

}

}

template <typename T>

Point<T>::Point(const Point & p): StatPtr(p.StatPtr)

{ if(StatPtr) StatPtr->Count++;

}

template <typename T>

Point<T>::~Point()

{ if(StatPtr)

{ StatPtr->Count--;

if(StatPtr->Count <= 0)

{delete StatPtr->RealPtr; delete StatPtr;

}

}

}

template <typename T>

T * Point <T>::operator->() const

{ if(StatPtr)

return StatPtr->RealPtr;

else return NULL;

}

 

 

template <typename T>

T & Point<T>::operator *() const

{ if(StatPtr) return *StatPtr->RealPtr;

else throw "Opps";

}

template <typename T>

Point<T> & Point<T>::operator =(const Point & p)

{ if(StatPtr)

{StatPtr->Count--;

if(StatPtr->Count <= 0)

{delete StatPtr->RealPtr; delete StatPtr;

}

}

StatPtr = p.StatPtr;

if(StatPtr) StatPtr->Count++; return * this;

}

struct Str

{ int a;

char c;

};

int main()

{ Point<Str> pt1(new Str); // Point,

// pt1,

// Str,

//

Point<Str> pt2=pt1,pt3; // pt2 ,

// pt3

pt3=pt1; // pt3 pt1

(*pt1).a=12; // operator*() this pt1

(*pt1).c='b';

int X=pt1->a; // operator->() this- pt1

char C=pt1->c;

return 0:

}

 

 

47. ++.

, − (public), - (private) , . . , .

C++ get_val() put_val() .

 

 

_declspec property.

.

class cls

{ int m;

public:

_declspec(property(get=get_val, put=put_val)) int V;

int get_val()

{ return m; }

void put_val(int v)

{ m = v; }

};

:

cls obj;

obj.V = 50; // put_val()

int k = obj.V; // get_val()

 

:

.

 

.

, , .

: 5 7 10 . , , :

  • ( 5; 10 ; 5; 7; 10 ; 7

, , . , , , , 5 10 , 7 .

____________________

template <class T1>

class A

{

T1 x;

public:

void set(T1 X){x=X;}

T1 get(){return x;}

void Show(){cout<<x<<endl;}

};

 

template <class T2>

class Tran

{

T2 *that; // A

T2 *prev; //

public:

Tran(){prev = NULL; that = new T2;}

Tran(const Tran &obj):that(new T2(*(obj.that))),prev(NULL){}//constr copy for A

~Tran() {delete prev; delete that;}

Tran &operator = (const Tran & obj);

void Show();

void Begin_Tran(); //

void Commit(); //

void Del_Tran(); //

T2 *operator->();

};

template <class T2>

Tran <T2> & Tran <T2>::operator = (const Tran & obj)

{

if(this!=&obj) { delete that; that = new T2(*(obj.that)); } //prev ,

return *this; //

}

 

 





:


: 2016-07-29; !; : 409 |


:

:

, .
==> ...

1721 - | 1544 -


© 2015-2024 lektsii.org - -

: 0.013 .