C 沉思錄 控制代碼2

2021-09-08 14:20:34 字數 1887 閱讀 2172

1、【c++沉思錄】控制代碼1 存在問題:

控制代碼為了繫結到point的物件上,必須定義乙個輔助類upoint,如果要求控制代碼繫結到point的子類上,那就存在問題了。

2、有沒有更簡單的辦法呢?

控制代碼使用point*直接繫結到point物件上(包括子類),為了保持多個控制代碼引用計數的一致性,使用int* 指向引用計數。

3、**如下:

#include "point.h"

class handle_2

handle_2(int x,int y):_p(new point(x,y)),_u(new int(1)){}

handle_2(const point& rhs):_p(new point(rhs)),_u(new int(1)){}

~handle_2()

handle_2(const handle_2& rhs)

handle_2& operator=(const handle_2& rhs)

return * this;

}int getx()

int gety()

handle_2& setx(int x)

else

return *this;

}handle_2& sety(int y)

else

return *this;

}private:

void addref(const handle_2& rhs) // 複製物件指標和引用計數指標,增加引用

void subref()// 減少引用,判斷是否delete物件和引用計數

}private:

point* _p;

int* _u;

};4、這裡要手動管理動態記憶體 int* _u; 同樣道理,可以使用棧上物件進行管理,抽象出乙個輔助類 usecount

class usecount

usecount(const usecount& rhs)

usecount& operator=(const usecount& rhs)

return *this;

}~usecount()

bool isonly()

void makeonly()

--*_p;

_p = new int(1);

}private:

void addref(const usecount& rhs)

void subref()

}private:

int* _p;

};#include "point.h"

#include "use_count.h"

class handle_2

handle_2(int x,int y):_p(new point(x,y)){}

handle_2(const point& rhs):_p(new point(rhs)){}

~handle_2()

handle_2(const handle_2& rhs)

handle_2& operator=(const handle_2& rhs)

return * this;

}int getx()

int gety()

handle_2& setx(int x)

else

return *this;

}handle_2& sety(int y)

else

return *this;

}private:

void addref(const handle_2& rhs)

void subref()

}private:

point* _p;

usecount _u;

};

C 沉思錄 控制代碼類2

c 沉思錄 的第六章介紹了控制代碼類,第七章也介紹控制代碼類,不過這章介紹的是引用技術和物件資料分開的技術,有3個類handle,point和usecount組成 順便新增了點自己認為重要的注釋 使用三個資料結構取代第六章的兩個資料結構會增加了模組化的程度而沒有增加額外的複雜性 並不是很理解這句話的...

C 沉思錄 控制代碼1

1 在 c 沉思錄 類中,使用了 類,存在問題 a 複製,每次建立乙個副本,這個開銷有可能很大 b 有些物件不能輕易建立副本,比如檔案 2 怎麼解決這個問題?使用引用計數控制代碼,對動態資源封裝,控制代碼包含指標,多個控制代碼可以指向同乙個物件。複製的時候,只是複製控制代碼的指標。3 使用引用計數控...

C 沉思錄 控制代碼類1

看了下 c 沉思錄 第六章的內容介紹的是控制代碼第一部分,採用引用計數器的方式減少記憶體的拷貝 動手敲了下 加深點印象,加了點注釋 class point point int x,int y xval x yval y int x const int y const point x int xv p...