Re: [問題] 物件、指標跟參考的混合問題

作者: littleshan (我要加入劍道社!)   2015-04-26 00:33:14
※ 引述《wtchen (沒有存在感的人)》之銘言:
: ================ 我是問題分隔線-1 ==================
: 問題1 :
: 關於class C :
: 如果我不希望在C物件中重新建立一個B物件,而是能夠連接到一個已經存在的B 物件
: 那我是不是要把B C_B ; 這行改成 B &C_B ?
: 然後建構子的話改成C(int c0, double c1, B &c2) : C_i(c0), C_d(c1), C_B(c2) ?
語法上是這樣沒錯
但這麼做非常危險
因為你很可能會指向一個被解構的物件
另一方面在 C 解構時,它不知道是否需要同時解構 B
這樣會造成 memory leak 或 double free
如果多個 C 物件會共享一個 B
那麼你應該使用 shared_ptr<B>
: ================ 我是問題分隔線-1 ==================
: 然後如果我創造一個物件D,其元件為class C的指標vector
: (因為我不希望重新在D裏面建立物件C,只希望連到已有的物件C)
: 依照我測試的結果好像是這樣:
: class D {
: public :
: void add_course(const C &c){ // 增加vector_c的元素
: vector_C.push_back(&c);
: }
: const C *getC(size_t i) { // 讀取第i個 vector_C元素
: return vector_C[i];
: }
: private :
: vector <const C*> vector_C;
: };
同樣的,語法是這樣沒錯,但可能會指向被解構的物件
也很容易造成 memory leak 或 double free
: ================ 我是問題分隔線-2&3 ==================
: 問題2 :
: 關於class D :
: const C *getC(int i) 跟 const C &getC(int i) 到底有啥不同?
: 問題3 :
: 當我在解構 class D的時候會把 vector_C指向的 物件C們都解構掉嗎?
不會
這種情況下的 ownership 控制非常重要
你應該用 vector< shared_ptr<C> >,或是 boost::ptr_vector<C>
: ================ 我是問題分隔線-2&3 ==================
: 如果這時再建一個class E :
: class E {
: public :
: E(D &d) : E_D(d){} // 建構子
: int compute(size_t i, size_t j) const{
: return E_D.getC(i)->getXX() + E_D.getC(j)->getXX();
: }
: private :
: const D &E_D;
: };
: ================ 我是問題分隔線-4 ==================
: 問題4 :
: 關於int compute(size_t i, size_t j) const這邊我怎麼try都沒辦法
: 要怎麼在E裏面使用其物件E_D裏面的物件C裏面的function?
: 在都是public的情況下
getC() 應該宣告為 const C *getC(size_t i) const;
: ================ 我是問題分隔線-4 ==================
: 希望各位先進能夠給予指教。
: 感謝。
作者: wtchen (沒有存在感的人)   2015-04-26 01:12:00
感謝說明,這樣清楚多了
作者: BlazarArc (Midnight Sun)   2015-04-26 19:57:00
要先考慮B跟C的生命週期跟擁有權管理吧?如果B肯定比C活得久且C不擁有B, 用reference應該ok
作者: adrianshum (Alien)   2015-04-26 21:45:00
其實這寫法不少見,Pimpl pattern 常這樣寫吧

Links booklink

Contact Us: admin [ a t ] ucptt.com