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

看板C_and_CPP (C/C++)作者 (沒有存在感的人)時間11年前 (2015/04/25 23:30), 11年前編輯推噓3(3013)
留言16則, 2人參與, 最新討論串1/2 (看更多)
最近在想如何在節省記憶體的情況下(不做多餘的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

04/25 23:45, , 1F
問題3: 不會; 問題4: 因為那些 getXX 都沒有 const,
04/25 23:45, 1F

04/25 23:45, , 2F
可是回傳的指標卻是指到 const C, 於是就失敗了
04/25 23:45, 2F

04/25 23:45, , 3F
getXX 不會動到東西的話, 可改成 int getXX() const {..}
04/25 23:45, 3F

04/25 23:46, , 4F
修飾this ^^^^^^^
04/25 23:46, 4F
※ 編輯: 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

04/26 00:24, , 5F
(1) 因為你 E 裡面的 D 也是 const, 所以 D 的 member
04/26 00:24, 5F

04/26 00:24, , 6F
function 該 const 的也要 const
04/26 00:24, 6F

04/26 00:25, , 7F
(2) C 的 B 漏了 &
04/26 00:25, 7F
已照建議修正,不過似乎不只這些問題。 ※ 編輯: wtchen (90.41.0.56), 04/26/2015 00:47:45

04/26 00:51, , 8F
我加了這些就 compile 過了呀
04/26 00:51, 8F

04/26 00:51, , 9F
你的 C class 裡面的 B 還是不是 &
04/26 00:51, 9F

04/26 00:52, , 10F
getC 也仍然不是 const
04/26 00:52, 10F
抱歉,我剛才才發現原來getC前後都要加 const (原來加前面跟加後面是不一樣的) ※ 編輯: wtchen (90.41.0.56), 04/26/2015 00:55:52

04/26 00:56, , 11F
沒錯, 加前面是 return type 的一部分, 加後面是修飾
04/26 00:56, 11F

04/26 00:57, , 12F
this
04/26 00:57, 12F

04/26 10:21, , 13F
對了 問題2: 就只是一個是 pointer 一個是 reference
04/26 10:21, 13F

04/26 10:21, , 14F
所以一個有 pointer 需要注意的各種狀況 一個有 ref 需要
04/26 10:21, 14F

04/26 10:22, , 15F
注意的各種狀況
04/26 10:22, 15F

04/26 16:26, , 16F
感謝說明!
04/26 16:26, 16F
文章代碼(AID): #1LExCNrN (C_and_CPP)
文章代碼(AID): #1LExCNrN (C_and_CPP)