所以我有3个MFC对话框:
XXXResourceFile.h - Dialog2和Dialog3使用的资源文件;仅包含资源(宏常量,仅在文件中使用的typedef结构,以及typedefed结构的数组);没有上课
在Dialog1中,我需要参考Dialog2(用于显示窗口/模态)。
在Dialog2中,我需要引用Dialog1(用于调用GetParent())和3(用于显示窗口/模态)
在Dialog3中,我需要引用Dialog1和2(用于调用GetParent()/ GetAncestor())
当前设计:
//Dialog1.h - by co-dev
...
#include Dialog2.h"
...
//Dialog2.cpp - by co-dev
...
#include "Dialog2.h"
#include "XXXResourceFile.h"
#include "Dialog1.h"
#include "Dialog3.h"
...
//Dialog3.cpp - my initial code/design
...
#include "Dialog3.h"
#include "Dialog2.h"
#include "Dialog1.h"
#include "XXXResourceFile.h"
我的理想设计:
//Dialog1.h
#include "Dialog2.h"
...
//Dialog2.h
#include "Dialog1.h"
#include "Dialog3.h"
#include "XXXResourceFile.h"
//Dialog3.h
#include "Dialog1.h"
现在,在当前设计中,我在所有这些标头中添加了#pragma once
。我收到错误lnk 2005(说XXXResourceFile中的数组已经在Dialog3.obj中定义,不能双击错误,因为它不在头文件和源文件上,而是在obj上)。
我的问题是:
#pragma once
的用法。据我所知(也基于我的共同开发者所说的),它仅包含在头文件中。怎么样的cpp文件?#pragma once
的正确用法是否应该在此标题上?或者包含此标题的文件?这一点是我真的很困惑的部分。答案 0 :(得分:-1)
这里有标题循环依赖:
//Dialog1.h
#include "Dialog2.h"
...
//Dialog2.h
#include "Dialog1.h"
#include "Dialog3.h"
#include "XXXResourceFile.h"
//Dialog3.h
#include "Dialog1.h"
Dialog1.h包括Dialog2.h,其中包括Dialog1.h。
Dialog1.h包括Dialog2.h,其中包括Dialog3.h,其中包括Dialog1.h。
您可以使用前向声明和指针类型来解决此问题。
// Dialog1.h
class Dialog2;
class Dialog1
{
Dialog2* ptrDialog2;
};
// Dialog1.cpp
#include "Dialog2.h"
// Dialog2.h
class Dialog1;
class Dialog2
{
Dialog1* ptrDialog1;
};
// Dialog2.cpp
#include "Dialog1.h"