[問題] 如何隨時讀取另一個物件內的資訊

看板C_and_CPP作者 (shadowth)時間8年前 (2016/04/25 16:34), 編輯推噓2(2012)
留言14則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Visual Studio Community 2015 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) DxLib (同人遊戲常用的函數庫) 問題(Question): 現在我在寫一個縱向卷軸射擊遊戲(類似雷電的) 我現在的code內有幾個class: MAIN─DISPLAY_CONTROL─ PLAYER ENEMY SCORE...等 其中PLAYER下面有座標資訊,ENEMY下面也有座標資訊。 而我在運算子彈的時候,必須要從PLAYER類別提取自機的座標進行子彈軌跡的運算。 之前看日本的網站是說可以在DISPLAY_CONTROL類別下建立以下函數: ==== //DisplayControl.h ==== #include"player.h" #include"enemy.h" class DISPLAY_CONTROL{ private: PLAYER *player; ENEMY *enemy[ENEMY_MAX]; ... public: DISPLAY_CONTROL(); ~DISPLAY_CONTROL(); GetPlayerPosition(double *x, double *y); GetEnemyPosition(int index, double *x, double *y); ... /*新增區段*/ static DISPLAY_CONTROL& GetInstance(){ static DISPLAY_CONTROL control; return control; } }; ========= 建立GetInstance函數後, 這時候在PLAYER和ENEMY內,就可以用以下方式互相呼叫對方的座標: ======== //enemy.c下的shot函數(原型已經在enemy.h內) #define DEBUG void ENEMY::SHOT(){ //呼叫player的座標 DISPLAY_CONTROL &control = DISPLAY_CONTROL::GetInstance(); double player_x,player_y; control.GetPlayerPosition(&player_x, &player_y); #ifdef DEBUG DrawFormatString (10,400,GetColor(255,0,0),"player_x=%.1f,player_y=%.1f",x,y); //字串印出位置(x,y),文字顏色設定(RGB),字串內容(用法同stdio的printf) #endif ... } 但依照上面的做法,我發現子彈軌跡很怪,沒有因隨著自機移動而改變彈道。 把座標印出來DEBUG後,發現座標都是停在PLAYER class建構元下的初始值, 且不管我自機如何移動,反映在enemy下都還是初始值。 後來發現取消DisplayControl.h的新增區段後, 我可以在DisplayControl下正確讀取到自機座標, 而如果把新增區段填回去的話,又會讀取到錯的座標。 是不是我在GetInstance的寫法有錯? 懇請版上大大們詳加指教,謝謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.49.111 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1461573292.A.A2A.html

04/25 17:08, , 1F
我認知是想實作singleton 你第一次GetInstance後要接著new
04/25 17:08, 1F

04/25 20:55, , 2F
樓上, 這是一種實作方式
04/25 20:55, 2F

04/25 20:56, , 3F
你應該是要看你怎麼把座標設進去的吧?..
04/25 20:56, 3F

04/26 01:44, , 4F
用 reflection 最直覺 XD http://goo.gl/gU8ana
04/26 01:44, 4F

04/30 15:10, , 5F
原PO看到的作法是屬於 singleton pattern 沒錯
04/30 15:10, 5F

04/30 15:11, , 6F
問題在於 singleton 實作時只能有一個 instance
04/30 15:11, 6F

04/30 15:12, , 7F
如果在原本就已經有一個 instance 的情況下
04/30 15:12, 7F

04/30 15:12, , 8F
呼叫 GetInstance() 就會再多出一個 instance
04/30 15:12, 8F

04/30 15:13, , 9F
所以初級的解法就是,第一次產生 instance 就必須透過
04/30 15:13, 9F

04/30 15:13, , 10F
GetInstance() 這個函數
04/30 15:13, 10F

04/30 15:15, , 11F
可以把原本的建構子宣告成 private 以避免不當操作
04/30 15:15, 11F

05/01 01:01, , 12F
謝謝眾板友們幫忙! 研究程式碼後發現main下原本有new一
05/01 01:01, 12F

05/01 01:02, , 13F
次 然後實作singleton時又再生成一次 現在main下面改成
05/01 01:02, 13F

05/01 01:03, , 14F
只呼叫GetInstance後問題就解掉了 感謝各位提供線索!!
05/01 01:03, 14F
文章代碼(AID): #1N7TQieg (C_and_CPP)