看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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 ================== : 希望各位先進能夠給予指教。 : 感謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.32.28.146 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1429979597.A.45B.html
wtchen: 感謝說明,這樣清楚多了 04/26 01:12
BlazarArc: 要先考慮B跟C的生命週期跟擁有權管理吧? 04/26 19:57
BlazarArc: 如果B肯定比C活得久且C不擁有B, 用reference應該ok 04/26 19:58
adrianshum: 其實這寫法不少見,Pimpl pattern 常這樣寫吧 04/26 21:45