Инициализация указателя в конструкторах

Я разрабатываю клиентскую базу данных с использованием 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 ++)

0

Решение

Ваш конструктор:

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) гласят: «Элементы нестатических данных должны быть инициализированы в том порядке, в котором они были объявлены в определении класса».

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector