Я разрабатываю клиентскую базу данных с использованием MFC, и в последнее время я пытался создать класс для выполнения операций DAO (вместо того, чтобы реализовывать эти операции непосредственно в CDocument
учебный класс). Я назвал этот класс как CModel
, а также CDocument
содержит это. Для выполнения операций SQL с использованием CModel
класс, я должен иметь доступ к 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 ++)
Ваш конструктор:
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) гласят: «Элементы нестатических данных должны быть инициализированы в том порядке, в котором они были объявлены в определении класса».
Других решений пока нет …