線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1542
推到 Plurk!
推到 Facebook!

關於兩個class之間的變數存取

答題得分者是:miyu
biau
一般會員


發表:25
回覆:32
積分:21
註冊:2003-02-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-02 23:17:36 IP:163.28.xxx.xxx 未訂閱
首先 向各位大大致歉一下,因為我還是一位初學者 如果問的太過不對還請見諒,不過我實在不知道哪裡有錯 已經搞了整晚了.....    我做了兩個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-02 23:28:14 IP:140.135.xxx.xxx 未訂閱
弄錯意思了,抱歉 發表人 -
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-02 23:58:33 IP:61.224.xxx.xxx 未訂閱
引言: 首先 向各位大大致歉一下,因為我還是一位初學者 如果問的太過不對還請見諒,不過我實在不知道哪裡有錯 已經搞了整晚了..... 我做了兩個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());
 }    };
我這麼說好了, 你有沒有想過, class 只是一個宣告, 而不是一個實體. 請問你要抓誰? --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子
biau
一般會員


發表:25
回覆:32
積分:21
註冊:2003-02-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-03 13:05:56 IP:163.19.xxx.xxx 未訂閱
感謝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了
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-03 13:34:51 IP:218.160.xxx.xxx 未訂閱
你要的是不是這樣  
class A{
public:
 int a;
 A(){a=10;}
};    class B{
public:     int b;
 B(){
   b=20;
 }
};    A *a = new A();
B *b = new B();    b->b = a->a; 
 
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-03 14:56:49 IP:211.75.xxx.xxx 未訂閱
引言: 感謝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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-03 21:20:40 IP:163.28.xxx.xxx 未訂閱
感謝 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-03 22:43:56 IP:61.224.xxx.xxx 未訂閱
引言: 感謝 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-09-04 11:50:08 IP:163.19.xxx.xxx 未訂閱
引言: 你目前的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 不辭辛苦及多次煩擾!!說聲 謝謝囉
系統時間:2024-06-01 23:02:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!