gpt4 book ai didi

c++ - 构造函数中的指针初始化

转载 作者:行者123 更新时间:2023-11-28 03:08:43 24 4
gpt4 key购买 nike

我正在使用 MFC 开发一个客户端数据库,最近我试图创建一个类来执行 DAO 操作(而不是直接在 CDocument 类中实现这些操作)。我将这个类命名为CModelCDocument 包含它。为了使用 CModel 类执行 SQL 操作,我必须有权访问 m_session 变量 - 它表示数据库访问 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) 中, 中声明的每个变量的构造函数code>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_MFCApplicationSetModel 更早初始化> 标准 (12.6.2 §5) 说:“非静态数据成员应按照它们在类定义中声明的顺序进行初始化”

关于c++ - 构造函数中的指针初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19040152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com