2013-09-26 55 views
0

我正在開發一個使用MFC的客戶端數據庫,最近我試圖創建一個類來執行DAO操作(而不是直接在CDocument類中實現這些操作)。我將這個類命名爲CModel,並且CDocument包含它。爲了使用CModel類執行SQL操作,我必須能夠訪問m_session變量(代表數據庫訪問會話),並且可以在RecordSet類中找到它 - 它代表我的數據庫中的一個表。下面是一段代碼,以更好地說明情況:構造函數中的指針初始化

#pragma once 
#include "MFCApplicationSet.h" 

class CModel 
{ 
public: 
    CModel(CMFCApplicationSet ApplicationSet); 
    ~CModel(); 
    CMFCApplicationSet * pModelSet; 
} 

// Model.cpp : implementation file 
// 

#include "stdafx.h" 
#include "MFCApplication.h" 
#include "Model.h" 
#include "SQLQuery.h" 
#include "MFCApplicationSet.h" 

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 

CModel::CModel(CMFCApplicationSet ApplicationSet) 
{ 
    pModelSet = &ApplicationSet //not sure if it is right 
} 

CModel::~CModel() 
{ 
} 


// MFCApplicationDoc.h : interface of the CMFCApplicationDoc class 
#pragma once 
#include "MFCApplicationSet.h" 
#include "Model.h" 

class CMFCApplicationDoc : public CDocument 
{ 
protected: // create from serialization only 
    CMFCApplicationDoc(); 
    DECLARE_DYNCREATE(CMFCApplicationDoc) 
// Attributes 
public: 
    CMFCApplicationSet m_MFCApplicationSet; 
    CModel Model; 
} 


// MFCApplicationDoc.cpp : implementation of the CMFCApplicationDoc class 
// 

#include "stdafx.h" 
#ifndef SHARED_HANDLERS 
#include "MFCApplication.h" 
#endif 

#include "MFCApplicationSet.h" 
#include "MFCApplicationDoc.h" 
#include "Model.h" 

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 

IMPLEMENT_DYNCREATE(CMFCApplicationDoc, CDocument) 

BEGIN_MESSAGE_MAP(CMFCApplicationDoc, CDocument) 
END_MESSAGE_MAP() 

// CMFCApplicationDoc construction/destruction 

CMFCApplicationDoc::CMFCApplicationDoc() 
{ 
    //problem in implementing a instruction to call the Model object constructor 
} 

CMFCApplicationDoc::~CMFCApplicationDoc() 
{ 
} 

我用調試器來分析我的代碼流,我注意到的是,從CMFCApplicationDoc構造(CDocument),從每個變量構造函數中聲明CMFCApplicationDoc.h被初始化。這裏是我的問題:我試圖創建一個CModel的構造函數,以便pModelSet指針自動引用Doc類中聲明的變量m_MFCApplicationSet(檢查構造函數參數),但在構建內部指令時遇到了一些麻煩Doc類。有沒有特定的或可能的替代方法來做到這一點? (抱歉,如果這個任務是一種基本的,但我還是很菜鳥的C++)

回答

2

你的構造:

CModel(CMFCApplicationSet ApplicationSet); 

的值取CMFCApplicationSet類型的對象,這意味着創建傳遞對象的副本然後該副本在其內部使用。當你做到以下幾點:

pModelSet = &ApplicationSet; 

你實際上是存儲臨時對象,它破壞的ADDRES時執行熄滅構造的範圍。如果以後嘗試解除引用該指針,它將產生未定義的行爲

有些人可能會建議你傳遞一個指針,但如果你在你的CModel類仔細觀察,你會發現它只有一個構造函數,它採用PessoaSet對象,即CModel實例需要一些對象是否存在等PessoaSet型,即你應該保持一個參考,而不是一個指針

class CModel 
{ 
public: 
    CModel(CMFCApplicationSet& ApplicationSet) : modelSet(ApplicationSet) { } 
    CMFCApplicationSet& modelSet; 
} 

,並在包含的CModel實例其他類:

class CMFCApplicationDoc 
{ 
public: 
    CMFCApplicationDoc() : 
     Model(m_MFCApplicationSet) { } 

    CMFCApplicationSet m_MFCApplicationSet; 
    CModel Model; 
} 

只需注意順序,其中的CMFCApplicationDoc成員實際上是宣告事項在這裏,既然你想m_MFCApplicationSet早於Model初始化和標準(12.6.2§5)說:「非靜態數據成員應按照它們在類定義「」中聲明的順序進行初始化。

+0

行動,錯字糾正! – Mudkip

+0

那麼,我應該怎麼做才能讓pModelSet存儲一個非臨時對象的地址? – Mudkip

+0

@Mudkip:好的,可能的解決方案是將構造函數更改爲'CModel(CMFCApplicationSet * ApplicationSet)',並在調用它時將地址傳遞給它。但是你應該在這裏使用一個參考。 – LihO