我正在使用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
(检查构造函数参数) class,但是我在构造Doc
类时遇到了一些麻烦。有没有特定的或可能的替代方法来做到这一点? (对不起,如果这个任务有点基础,但我仍然是C ++中的新手)
答案 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)说:“非静态数据成员应按照在类定义中声明的顺序进行初始化”。