[問題] 類別的物件參考為其他類別的成員問題
開發平台(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
→
09/02 23:03, , 1F
09/02 23:03, 1F
→
09/02 23:07, , 2F
09/02 23:07, 2F
→
09/02 23:34, , 3F
09/02 23:34, 3F
※ 編輯: BIAO (61.230.200.178), 09/02/2015 23:37:00
→
09/02 23:37, , 4F
09/02 23:37, 4F
→
09/02 23:41, , 5F
09/02 23:41, 5F
→
09/02 23:42, , 6F
09/02 23:42, 6F
→
09/02 23:42, , 7F
09/02 23:42, 7F
→
09/02 23:44, , 8F
09/02 23:44, 8F
→
09/02 23:44, , 9F
09/02 23:44, 9F
→
09/02 23:45, , 10F
09/02 23:45, 10F
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
→
09/10 16:06, , 11F
09/10 16:06, 11F
→
09/10 16:06, , 12F
09/10 16:06, 12F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章