复制MFC对话框遇到的问题

起因

前同事问我有没有做过MFC?MFC只有上学的时候做过一个小项目,早就忘得的差不多了.原来是复制一个对话框.保留原有对话框的大部分功能的,新的对话框只有一些未调整.

复制对话框后,编译时很多错误,全是变量已经定义了.不知道是哪里的问题?

变量重复定义

因为没法源码,便新建MFC的项目.复制一个对话框.发现没有同事说的重复定义.一直在微信打字进行沟通.知道说变量在cpp声明.才觉得变量声明的位置是导致重复定义的原因.
TestDlg.h
class TestDlg : public CDialogEx
{
	DECLARE_DYNAMIC(TestDlg)

public:
	TestDlg(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~TestDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MFCAPPLICATION3_DIALOG1 };
#endif

protected:
	int val;  //在头文件中声明,在cpp文件中使用
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedOk();
};
// TestDlg.cpp: 实现文件
//

#include "pch.h"
#include "MFCApplication3.h"
#include "TestDlg.h"
#include "afxdialogex.h"


// TestDlg 对话框

IMPLEMENT_DYNAMIC(TestDlg, CDialogEx)
int imaaa;
TestDlg::TestDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MFCAPPLICATION3_DIALOG1, pParent)
{
	val = 100; //赋值
	CRect cret;
}



TestDlg::~TestDlg()
{
}

void TestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(TestDlg, CDialogEx)
	ON_BN_CLICKED(IDOK, &TestDlg::OnBnClickedOk)
END_MESSAGE_MAP()


// TestDlg 消息处理程序
void TestDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	MessageBox(L"hello mfc", L"窗口标题");
	CDialogEx::OnOK();
}

知道这个截图,才真正确定是哪里的问题.

变量声明的位置

变量声明的方式问题.在MFC中没有使用命名空间,不在头文件和class里面中声明的话,该变量的作用域是其他文件中可以访问的.简单点可以称作为全局变量的.其实这个问题和是不是MFC/C++没有关系.两个cpp文件中都有一个相同的变量名,所以才导致在编译时,一大堆的重复定义.

其次是在C++中使用C语言的方式.没有按C++方式使用. 一般都会在头文件的class内部进行变量声明.

简单粗暴的解决方式:

就是在变量声明前边,用static进行修饰.限制变量的作用域在当前文件中.

static int count;   //通过static修饰变量的作用域
static CRect cret;  
TestDlg::TestDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MFCAPPLICATION3_DIALOG1, pParent)
{
	val = 100; //赋值
}
秋风 2020-10-20