看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Windows -- 各位板友大家好, 有個問題想和各位請益, 這部份自己不管怎麼想也想不透, 希望板上先進能分享想法.. 一共有四個,類別A~D,類別D繼承了類別C,類別C有虛擬函式,由類別D處理。 (其實還有E、F、G...繼承了類別C) 類別A中宣告了類別B(簡稱物件B)及類別C(簡稱物件C)的物件當做其成員變數, 再將物件B傳參考給類別C的建構子(也包含類別D),在類別D成員函式內有用到物件B 的成員函式。 類別A的成員函式內容為一迴圈,程式依序將物件B的位址傳給物件C及D, 在物件D的成員函式內執行物件B的成員函式,但是僅第一次會成功, 第二次跑迴圈內容後,程式依舊有到達相同的物件D的成員函式位置, 但調用Windows API的部份失敗了... 後續做過以下驗證: 1.嘗試將進入物件C的成員函式註解,將其成員函式的內容概念直接於於物件A內 迴圈處理後,皆可正常運行。 2.嘗試在進入物件C的成員函式前後,放置原本物件C成員函式執行的內容, 發現進入物件C前可正確執行,但進入物件C後的動作則會失敗。 辛苦各位板友看完,真的想不透是哪裡有問題, 物件B的生命週期應該還在,因為是物件A的成員變數,且物件A也還在運行, 希望有相同經驗的板友能賜教,謝謝大家。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.230.200.178 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1441205966.A.8E3.html
Feis: 你需要的是想辦法寫個 code 出來, 看敘述觀念不是很正確 09/02 23:03
Feis: 試看看有沒有辦法用最少的 code 重現你的敘述 09/02 23:07
BIAO: F大您好,我目前已經有寫code了XD 09/02 23:34
※ 編輯: BIAO (61.230.200.178), 09/02/2015 23:37:00
BIAO: 請問您說有問題的部份是哪裡呢? 09/02 23:37
Feis: 我的意思是你需要把你的敘述寫成 code 拿出來看 09/02 23:41
Feis: 我猜你是把物件的概念弄錯了 09/02 23:42
Feis: 你要拿你已經寫好的也可以 09/02 23:42
Feis: 不然我先問一下你有用到指標嗎 09/02 23:44
Feis: (釉藥猜謎了) 09/02 23:44
BIAO: 好的,我等等整理,謝謝您。 09/02 23:45
F大您好,相關程式碼如下,類別C及類別D存放至雲端硬碟, 類別C為CTransaction,類別D為CQueryData。 連結如下:(因縮址被系統判定廣告連結,故沒有縮址) https://drive.google.com/folderview?id=0B-wgfyz-OoGLY1I1aVVTYU9uRlE&usp =sharing 另列出類別A中和類別C及D相關的代碼,供您參閱, 其中m_odbcHelper為類別B的物件,再麻煩您了,謝謝您~ -- bool CDBAccessSystem::HandleCommand(HANDLE hPipe, LPVOID lpParam, OVERLAPPED *Ovlap) { ODBCBaseCommand* lpODBCBaseCommand = (ODBCBaseCommand*)lpParam; CTransaction* lpTransaction; switch(lpODBCBaseCommand->CmdType) { case ODBCAddData: lpTransaction = createTransaction(ODBCAddData); lpTransaction->execute(hPipe, lpParam, Ovlap); delete lpTransaction; break; case ODBCModifyData: case ODBCDeleteData: case ODBCQueryData: lpTransaction = createTransaction(ODBCQueryData); lpTransaction->execute(hPipe, lpParam, Ovlap); delete lpTransaction; break; default: break; } return TRUE; } CTransaction* CDBAccessSystem::createTransaction(int type) { CTransaction* lpTemp; switch(type) { case ODBCAddData: lpTemp = new CAddData(m_odbcHelper); break; case ODBCModifyData: lpTemp = new CModifyData(m_odbcHelper); break; case ODBCDeleteData: lpTemp = new CDeleteData(m_odbcHelper); break; case ODBCQueryData: lpTemp = new CQueryData(m_odbcHelper); break; default: break; } return lpTemp; } ※ 編輯: BIAO (61.230.200.178), 09/03/2015 00:05:37
BIAO: 問題已自行解決,傳物件參考失敗!但傳物件指標就OK。 09/10 16:06
BIAO: 具體原因還得再想想~ 09/10 16:06