看板 C_and_CPP 關於我們 聯絡資訊
最近在想如何在節省記憶體的情況下(不做多餘的copy所以多用reference) 使用物件導向,不過不是很懂。 所以舉一個例子想請各位先進指導。 假設有這幾個class : #include <iostream> #include <iomanip> #include <string> #include <vector> using namespace std; class A { public : A(int a0, double a1) : A_i(a0), A_d(a1){} // 建構子 private : int A_i; double A_d; }; class B { public : // 建構子 B(int b0, double b1, int b2, double b3) : B_A(b0, b1), B_i(b2), B_d(b3) { } B(const B &) = delete; // 不准copy private : A B_A ; int B_i ; double B_d; }; class C { public : // 建構子 C(int c0, double c1, B c2) : C_i(c0), C_d(c1), C_B(c2) { cout << "class C created!" << endl; } C(const C &) = delete; // 不准copy ~C(){ cout << "class C deconstructed!" << endl; // 解構子 } int getXX() const{ return C_i; } ; // 假設getXX, getYY和getZZ都是有用的函式 bool getYY(C &c)const {return C_i>0;}; double getZZ() const {return C_d;} _ private : int C_i ; double C_d; B C_B; }; ================ 我是問題分隔線-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) ? ================ 我是問題分隔線-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; }; ================ 我是問題分隔線-2&3 ================== 問題2 : 關於class D : const C *getC(int i) 跟 const C &getC(int i) 到底有啥不同? 問題3 : 當我在解構 class D的時候會把 vector_C指向的 物件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的情況下 ================ 我是問題分隔線-4 ================== 希望各位先進能夠給予指教。 感謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.0.56 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1429975831.A.D57.html
suhorng: 問題3: 不會; 問題4: 因為那些 getXX 都沒有 const, 04/25 23:45
suhorng: 可是回傳的指標卻是指到 const C, 於是就失敗了 04/25 23:45
suhorng: getXX 不會動到東西的話, 可改成 int getXX() const {..} 04/25 23:45
suhorng: 修飾this ^^^^^^^ 04/25 23:46
※ 編輯: wtchen (90.41.0.56), 04/25/2015 23:58:12 剛才試過,加了也沒辦法... ※ 編輯: wtchen (90.41.0.56), 04/25/2015 23:58:38 ※ 編輯: wtchen (90.41.0.56), 04/26/2015 00:11:23 ※ 編輯: wtchen (90.41.0.56), 04/26/2015 00:13:07
suhorng: (1) 因為你 E 裡面的 D 也是 const, 所以 D 的 member 04/26 00:24
suhorng: function 該 const 的也要 const 04/26 00:24
suhorng: (2) C 的 B 漏了 & 04/26 00:25
已照建議修正,不過似乎不只這些問題。 ※ 編輯: wtchen (90.41.0.56), 04/26/2015 00:47:45
suhorng: 我加了這些就 compile 過了呀 04/26 00:51
suhorng: 你的 C class 裡面的 B 還是不是 & 04/26 00:51
suhorng: getC 也仍然不是 const 04/26 00:52
抱歉,我剛才才發現原來getC前後都要加 const (原來加前面跟加後面是不一樣的) ※ 編輯: wtchen (90.41.0.56), 04/26/2015 00:55:52
suhorng: 沒錯, 加前面是 return type 的一部分, 加後面是修飾 04/26 00:56
suhorng: this 04/26 00:57
suhorng: 對了 問題2: 就只是一個是 pointer 一個是 reference 04/26 10:21
suhorng: 所以一個有 pointer 需要注意的各種狀況 一個有 ref 需要 04/26 10:21
suhorng: 注意的各種狀況 04/26 10:22
wtchen: 感謝說明! 04/26 16:26