在.obj中定义的c ++多重

时间:2017-08-01 05:55:42

标签: c++ mfc header-files

所以我有3个MFC对话框:

  1. Dialog1 - 主对话框
  2. Dialog2 - Dialog1的子对话框
  3. Dialog3 - Dialog2的子对话框
  4. 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上)。

    我的问题是:

    1. 您能评论一下这个文件的当前设计和理想设计吗?什么需要纠正,缺少什么等等......
    2. 我认为我完全不了解#pragma once的用法。据我所知(也基于我的共同开发者所说的),它仅包含在头文件中。怎么样的cpp文件?
    3. 此外,由于我的问题是包含XXXResourceFile.h,#pragma once的正确用法是否应该在此标题上?或者包含此标题的文件?这一点是我真的很困惑的部分。

1 个答案:

答案 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"