c++ - 前向声明导致“找到一个或多个相乘的定义符号”?
问题描述
我正在使用前向声明,并且我已经小心不要在头文件中进行任何定义(仅声明),并且在每个头文件之前都有 #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();
}
解决方案
而且我已经小心不要在头文件中有任何定义(仅声明)
不,您 GlobalSys::eventManager
在GlobalSys.h
.
定义是完全定义由声明引入的实体的声明。每个声明都是一个定义,但以下内容除外:
- 任何带有外部存储类说明符或语言链接说明符(例如 extern "C")但没有初始化器的声明
您可以使用 of 将其更改为声明extern
。
全球系统
#pragma once
class EventManager;
namespace GlobalSys {
extern EventManager * eventManager; // declaration
}
然后在另一个实现文件中定义它,例如
全球系统.cpp
#include "GlobalSys.h"
namespace GlobalSys {
EventManager * eventManager; // definition
}
推荐阅读
- javascript - 重新打开浏览器时如何将数据保存到LocalStorage并检索
- python - Take one array and return 3 equal arrays if the array is not divisible by three, increase the size of the smaller array?
- javascript - 在 laravel 刀片中使用 refs 来预先检查复选框
- coldfusion - 使用地理编码验证地址的最佳方法?
- angular - 关于在 Angular 中使用 Material Design Component for Web (MDC Web) 的问题
- java - Executors.newSingleThreadExecutor 会一直运行在同一个系统核心上吗?
- reactjs - 修复 - 默认不是构造函数笑话错误
- c - 在按 ENTER 之前捕获 SIGINT 后程序不会结束?
- python - 如何用新的时间戳重写文件中的某些行
- java - 为什么 HTMLEditorKit 不想在元素内插入元素?