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

[繼承]執行結果少800??

尚未結案
Frances3399
一般會員


發表:13
回覆:16
積分:5
註冊:2003-10-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-25 20:33:51 IP:163.18.xxx.xxx 未訂閱
#include     using std::cout;    using std::cin;    using std::endl;        class BankAccount{        private:            char* name;            int saving;        public:            BankAccount(){            };            BankAccount(char* str, int money){                name = str;                saving = money;            }            void deposit(int money){                saving  = money;            }            int withdraw(int money){                saving -= money;                return saving;            }            void query(){                cout << "帳戶姓名:" << name << endl;                cout << "帳戶餘額:" << saving << endl;            }    };    class ExBankAccount : public BankAccount{        public:            ExBankAccount(char* str, int money):BankAccount(str, money){            }            void transfer(BankAccount A, int money){            A.deposit(withdraw(money));            }    };
void main()    {        ExBankAccount John("JOHN", 1000);        ExBankAccount Mary("MARY", 2000);        John.transfer (Mary, 800);        John.query();        Mary.query();    }
我執行此結果~都除錯了! 可是為什麼錢會少800呢? 執行結果↓ ======== 帳戶姓名:JOHN 帳戶餘額:200 帳戶姓名:MARY 帳戶餘額:2000 ======== Why?? 懇請各位先進多多指教~~謝謝 發表人 - Frances3399 於 2003/12/25 20:35:21

中階會員


發表:36
回覆:142
積分:70
註冊:2003-07-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-26 00:14:08 IP:163.23.xxx.xxx 未訂閱
Frances3399 您好:    參考以下有顏色的部份,改過來就會正確    #include     using std::cout;    using std::cin;    using std::endl;    class BankAccount{        private:            char* name;            int saving;        public:
        // 以下怪怪的,產生了兩個 constructor,也許是您要 overload 吧 ^^
        BankAccount(){
          // 預設值下,建議是讓 saving = 0  
        };             BankAccount(char* str, int money){                name = str; // 字串相等不該用 "=" 
            saving = money;            }            void deposit(int money){                saving  = money;            }            int withdraw(int money){                saving -= money;                return saving;            }            void query(){                cout << "帳戶姓名:" << name << endl;                cout << "帳戶餘額:" << saving << endl;            }    };    class ExBankAccount : public BankAccount{        public:            ExBankAccount(char* str, int money):BankAccount(str, money){            }            void transfer(BankAccount *A, int money)
        {
          withdraw(money) ; // 將 JOHN 的錢減少 money 
          A->deposit(money); // 再將 A object 的錢加 money
        }     };
void main()    {        ExBankAccount John("JOHN", 1000);        ExBankAccount Mary("MARY", 2000);        John.transfer (&Mary, 800); //要傳址
// 原因在於,在 transfer 中,複製的物件的生命會隨著 function 的結束而結束
// 這是可以測試的,在您的 transfer function 中呼叫 A.query 就知道了
// 但在您的 main function 中,呼叫 A.query() 時就會錯誤,因為已經 destructor (解構?) 了
// 您再多 try try 看吧,也許有助於你使用 Object 的觀念 
 
    John.query();        Mary.query();    }    執行結果↓
========
帳戶姓名:JOHN
帳戶餘額:200
帳戶姓名:MARY
帳戶餘額:2800
========      
發表人 - 流 於 2003/12/26 00:50:30
Frances3399
一般會員


發表:13
回覆:16
積分:5
註冊:2003-10-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-29 13:14:28 IP:163.18.xxx.xxx 未訂閱
        void transfer(BankAccount *A, int money)
        {
          withdraw(money) ; // 將 JOHN 的錢減少 money 
          A->deposit(money); // 再將 A object 的錢加 money
        }
我有個疑問喔!
A->deposit(money);
是什麼意思阿?
跟A.deposit(money);
有何不同??
為什麼我用
A.deposit(money);
會發生
[C   Error] Ch06_08_xx.cpp(69): E2294 Structure required on left side of . or .*
煩請指教!!
biau
一般會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-29 17:29:47 IP:163.28.xxx.xxx 未訂閱
因為 BankAccount *A 的 A是一個 pointer 所以要用->指向member function 也就是A->deposit(money); 如果你把BankAccount *A改寫成BankAccount A; 那麼A在此 就是一個 reference 要用. 點向member function 也就是A.deposit(money); 一個是pointer 另一個是reference
Frances3399
一般會員


發表:13
回覆:16
積分:5
註冊:2003-10-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-29 19:09:00 IP:163.18.xxx.xxx 未訂閱
引言: 因為 BankAccount *A 的 A是一個 pointer 所以要用->指向member function 也就是A->deposit(money); 如果你把BankAccount *A改寫成BankAccount A; 那麼A在此 就是一個 reference 要用. 點向member function 也就是A.deposit(money); 一個是pointer 另一個是reference
那麼如果我要用A.deposit(money); 那應該要如何改寫程式才可Run呢?

中階會員


發表:36
回覆:142
積分:70
註冊:2003-07-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-29 22:12:05 IP:163.23.xxx.xxx 未訂閱
Frances3399 您好:    您問的問題小弟沒法幫您克服了
原因在於當 transfer function 中的 A 物件有他的生命週期
一但 transfer function 結束,則 A 物件也跟著結束
如果您非得用 A.deposite 的話
那只好在 transfer function 中先行呼叫 query() 這個 function
如:    void transfer(BankAccount A, int money)
  {
    A.deposit(money) ;
    withdraw(money) ;
    A.query() ;
  }    在 A 物件尚未結束之前,就查詢 transfer 後的結果
所以在您 main 的主程式中,就不用 Mary.query() 了
不過這應該不是您要的結果
所以,小弟的建議還是傳址或指標傳會對您比較好    如果回答的不好還請多多包涵        
        
系統時間:2024-11-25 12:37:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!