首页 > 解决方案 > 前向声明导致“找到一个或多个相乘的定义符号”?

问题描述

我正在使用前向声明,并且我已经小心不要在头文件中进行任何定义(仅声明),并且在每个头文件之前都有 #pragma once 指令。然而,不知何故,多重定义错误仍在发生。所以在 GlobalSys.h 中,我使用前向声明,然后我将把这个文件包含到任何需要访问这个全局变量的文件中。在 application.h 中,我初始化了这个全局变量,所以我必须包含 EventManager.h,否则编译器会报错。我在哪里做错了?

全球系统

#pragma once
class EventManager;

namespace GlobalSys {
    EventManager * eventManager;
}

应用程序.h

#include "GlobalSys.h"
#include "../Event/EventManager.h" 

class Application {

public:
    Application();
};

应用程序.cpp

#include "Application.h"

Application::Application() {
    GlobalSys::eventManager = new EventManager();
}

标签: c++declarationdefinition

解决方案


而且我已经小心不要在头文件中有任何定义(仅声明)

不, GlobalSys::eventManagerGlobalSys.h.

定义是完全定义由声明引入的实体的声明。每个声明都是一个定义,但以下内容除外:

  • 任何带有外部存储类说明符或语言链接说明符(例如 extern "C")但没有初始化器的声明

您可以使用 of 将其更改为声明extern

全球系统

#pragma once
class EventManager;

namespace GlobalSys {
    extern EventManager * eventManager; // declaration
}

然后在另一个实现文件中定义它,例如

全球系统.cpp

#include "GlobalSys.h"

namespace GlobalSys {
    EventManager * eventManager; // definition
}

推荐阅读