复制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