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指针自动引用类中m_MFCApplicationSet声明的变量(检查构造函数参数)Doc,但是在类的构造中给出这个指令时遇到了一些麻烦Doc。是否有特定的或替代的方法来做到这一点?(对不起,如果这个任务有点初级,但我还是 C++ 的新手)

4

1 回答 1

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)说:“非静态数据成员应按照它们的声明顺序进行初始化类定义”

于 2013-09-26T23:15:31.413 回答