關於兩個class之間的變數存取 |
答題得分者是:miyu
|
biau
一般會員 發表:25 回覆:32 積分:21 註冊:2003-02-27 發送簡訊給我 |
首先 向各位大大致歉一下,因為我還是一位初學者
如果問的太過不對還請見諒,不過我實在不知道哪裡有錯
已經搞了整晚了..... 我做了兩個class A,B...想從class B去抓 class A 產生出來的 int a;
我看了書上可以直接用A::getValueA()去得到int a
不過我試做一下,在compile時就出現error
[C++ Error] B.h:E2283 Use . or -> to call 'A::getValueA()'
class A{ friend class B; public: int a; A(){a=10;} int getValueA(){return a;} }; class B{ friend class A; public: int b; B(){ b=20; ShowMessage(A::getValueA()); } }; |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: 首先 向各位大大致歉一下,因為我還是一位初學者 如果問的太過不對還請見諒,不過我實在不知道哪裡有錯 已經搞了整晚了..... 我做了兩個class A,B...想從class B去抓 class A 產生出來的 int a; 我看了書上可以直接用A::getValueA()去得到int a 不過我試做一下,在compile時就出現error [C Error] B.h:E2283 Use . or -> to call 'A::getValueA()'我這麼說好了, 你有沒有想過, class 只是一個宣告, 而不是一個實體. 請問你要抓誰? --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子class A{ friend class B; public: int a; A(){a=10;} int getValueA(){return a;} }; class B{ friend class A; public: int b; B(){ b=20; ShowMessage(A::getValueA()); } }; |
biau
一般會員 發表:25 回覆:32 積分:21 註冊:2003-02-27 發送簡訊給我 |
|
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
|
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: 感謝miyu 大哥.... 我會先在Form建立時以A* pa=new A() new出一個instance; 再用B* pb=new B(); 以pb來呼叫class B的constructor(想在這裡去讀class A的member data) 想在A* pa=new A()之後,在別的class(例如class B)也可以讀到class A的 member data 這樣想法不知道是否恰當 但是 compile初期就出現Error了設計是你想的, 你希望程式怎麼跑是你的事. 只要語法對, 他就是會動. 至於語意跟範式是另一個層次的問題了. 先說明的是, friend 這個 keyword 存在的目的是, 讓被宣告成為 friend 的 function 或是 class 可以存取 object 中私有的 object. 針對你的問題, 首先想一想下面這段code: A *A1 = new A(); A *A2 = new A(); A A3; B *B1 = new B(); 這樣的 Code 對 Compiler 來說是合法的吧? 那麼, 問題來了. 你有三個 class A 的 object, 請問你的 B 要存取哪一個? 當然, 或許你要問, 我的程式裡只有一個 class A object 和一個 class B object, 可是反過來說, 那是你知道, compiler 怎麼會知道? 所以, 你要明白的告訴compiler 你要存取誰啊. class A { friend class B; public: int a; A() {a=10;} int getValueA(){return a;}; }; class B { friend class A; public: int b; B(A *pA){ b=20; ShowMessage(pA->getValueA()); } }; void Test(void) { A A1; B B1(&A1); }再不然就是宣告成為 static. class A { friend class B; public: static int a; A() { a=10;} static int getValueA(){return a;}; }; int A::a = 0; class B { friend class A; public: int b; B(){ b=20; ShowMessage(A::getValueA()); } }; void Test(void) { A A1; B B1; }但是, static member 只存在一個實體. 關於變數的生命週期問題, 請參考我吐的嘈 post: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=29349 說真的, 我還是不懂你要幹嘛 --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子 發表人 - Miyu 於 2003/09/03 15:03:16 |
biau
一般會員 發表:25 回覆:32 積分:21 註冊:2003-02-27 發送簡訊給我 |
感謝 Miyu 與 brook兩位前輩
我的問題比較傾向於Miyu的說法
也讓我從Miyu學了一些...Miyu果然功力深厚 我提這個問題是因為我需要從一個class中去得到另一個
class的member data,程式會不斷加入 class A 的 vector
而 class A 的 vector 的值,當作class B裡的一個function
處理的參考,因為class A 與 class B彼此沒有繼承關係
所以才想用keyword "friend"處理這個問題...
只是看了書上的說法可以直接以A::getValueA()去取得
class A 的 vector值,試做卻又做不出來,才請各位大大幫忙
或許想法是錯的...希望大大給予直接的指正
|
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: 感謝 Miyu 與 brook兩位前輩 我的問題比較傾向於Miyu的說法 也讓我從Miyu學了一些...Miyu果然功力深厚其實我也苦惱了很多年啊, C standard specification 真是好東西... 不過, 或許太好了一點 (苦笑) 引言: 我提這個問題是因為我需要從一個class中去得到另一個 class的member data,程式會不斷加入 class A 的 vector 而 class A 的 vector 的值,當作class B裡的一個function 處理的參考,因為class A 與 class B彼此沒有繼承關係 所以才想用keyword "friend"處理這個問題...老實說, 上面我看得一頭霧水 :) 在 C 的語意中, class 跟 object 是兩回事. Class 由 programmer 定義, 而 object 由程式在 runtime 產生. 你無法在 runtime 產生新的 class, 你也無法在 design time 產生 object. 這樣犧牲的代價, 換到的就是 C 高效率的保證! 相對的, 不同於 C , 在 smalltalk 中, class 跟 object (幾乎)被視為等同定義. 在那種系統中, 你可以在 runtime 產生/Copy/儲存 class. 這樣方便的代價是, 你的runtime system 會比編譯時期決定一切的靜態語言慢. 你目前的desgin, 是不是在一個 vector 中存放 class A 而程式會不斷的把新產生出來, 且 type 為 class A 的 Object 往這個 vector 裡放: 而 class B 有必要去參考到 vector 中某一個 type 為 Class A 的 object 中的值? 首先啊, 你把東西都放在 public 區段裡, 如果只是應急, 怎樣都好的話, 實在是不用動到 friend.. 第二點, 你有一個 int getValueA(); 的function, 照一般設計的想法, 這個就應該是供你取得 private 資料的介面才是啊.. class A { friend class B; // 如果 class B 中要處理/呼叫到 A 的 private data member/function 要宣告 private: int a; public: A() {a=10;} int getValueA() {return a;}; }; class B { private: int b; public: B(A *pA){ b=20; ShowMessage(pA->getValueA()); } }; std::vector(A) Vector; Vector.push(xxx); // add object to vector ... B B1; B1(Vector[Index].getValueA()); // 如果你只要用 Value A B1(Vector[Index]); // 如果你要處理整個 class所以? 引言: 只是看了書上的說法可以直接以A::getValueA()去取得 class A 的 vector值,試做卻又做不出來,才請各位大大幫忙 或許想法是錯的...希望大大給予直接的指正唔, 我不知道你看到哪一本書的哪一段, 不過要寫成 A::getValueA() 這樣子, 除非是 in class static function. 否則語意上在作判斷時是會產生岐異的. --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子 |
biau
一般會員 發表:25 回覆:32 積分:21 註冊:2003-02-27 發送簡訊給我 |
引言: 你目前的desgin, 是不是在一個 vector 中存放 class A 而程式會不斷的把新產生出來, 且 type 為 class A 的 Object 往這個 vector 裡放: 而 class B 有必要去參考到 vector 中某一個 type 為 Class A 的 object 中的值?我的做法是在class A 中有一個vector,在執行階段 vector 會一直長大 class B 依據 class A 的 vector的大小做處理, 不過十分感激 miyu 不辭辛苦及多次煩擾!!說聲 謝謝囉 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |