构造函数中的指针初始化

时间:2013-09-26 23:07:41

标签: c++ pointers constructor mfc dao

我正在使用MFC开发一个客户端数据库,最近我试图创建一个类来执行DAO操作(而不是直接在CDocument类实现这些操作)。我将此类命名为CModelCDocument包含它。为了使用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指针自动引用m_MFCApplicationSet中声明的变量Doc(检查构造函数参数) class,但是我在构造Doc类时遇到了一些麻烦。有没有特定的或可能的替代方法来做到这一点? (对不起,如果这个任务有点基础,但我仍然是C ++中的新手)

1 个答案:

答案 0 :(得分:2)

你的构造函数:

CModel(CMFCApplicationSet ApplicationSet);

通过值获取类型为CMFCApplicationSet的对象,这意味着创建了传递对象的副本,然后在其正文中使用此副本。执行以下操作时:

pModelSet = &ApplicationSet;

实际上是存储临时对象的地址,当执行超出构造函数的范围时会被破坏。如果您之后尝试取消引用此指针,则会产生 未定义的行为

有些人可能会建议你传递一个指针,但是如果你仔细查看你的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)说:“非静态数据成员应按照在类定义中声明的顺序进行初始化”