错误 LNK2005:构造函数已定义
error LNK2005: constructor already defined
我在一个名为UIHandling.h
的头文件中有一个名为UIHandling
的类。在课程的顶部,我确保使用:
#ifndef _UIH_
#define _UIH_
当然,文件以#endif
结束
此头文件包含构造函数的所有实现。我已经将此类包含在程序的许多文件中,但由于某种原因,我收到以下编译器错误:
1>CompaniesMap.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" (??0UIHandling@@QAE@W4eType@@@Z) already defined in Bond.obj
1>CompaniesMap.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" (??0UIHandling@@QAE@XZ) already defined in Bond.obj
1>Company.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" (??0UIHandling@@QAE@W4eType@@@Z) already defined in Bond.obj
1>Company.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" (??0UIHandling@@QAE@XZ) already defined in Bond.obj
1>Date.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" (??0UIHandling@@QAE@W4eType@@@Z) already defined in Bond.obj
1>Date.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" (??0UIHandling@@QAE@XZ) already defined in Bond.obj
1>GovStock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" (??0UIHandling@@QAE@W4eType@@@Z) already defined in Bond.obj
1>GovStock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" (??0UIHandling@@QAE@XZ) already defined in Bond.obj
1>main.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" (??0UIHandling@@QAE@W4eType@@@Z) already defined in Bond.obj
1>main.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" (??0UIHandling@@QAE@XZ) already defined in Bond.obj
1>Stock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" (??0UIHandling@@QAE@W4eType@@@Z) already defined in Bond.obj
1>Stock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" (??0UIHandling@@QAE@XZ) already defined in Bond.obj
1>D:AsafCVShw5HW5DebugHW5.exe : fatal error LNK1169: one or more multiply defined symbols found
所以我去了Bond.h
,Bond.cpp
看看是否有任何奇怪的东西(比如UIHandling::UIHandling()
的实现或类似的东西),但没有。
我在另一个问题中看到,当您违反 ODR 时会显示此错误,但我没有。在另一个类似的问题中,答案是这与一遍又一遍地包含相同的文件有关,导致构造函数的许多不同实现,但使用 #ifndef _UIH
命令可以避免这种情况。
这可能与我如何声明和定义构造函数有关:在UIHandling.h
:
class UIHandling : public exception
{
public:
UIHandling(); // Default C'tor - error unknown
UIHandling(eType); // C'tor with error type
template <class T>
UIHandling(eType, T); // C'tor with error type and relevant number
...
}
...
UIHandling::UIHandling()
{
...
}
UIHandling::UIHandling(eType e)
{
...
}
template <class T>
UIHandling::UIHandling(eType e, T number)
{
...
}
有什么帮助吗?
如果要在类外部和标头中定义成员函数,则需要使用 inline
关键字并确保每个翻译单元仅包含一次标头的内容(即每个 cpp 文件,这是通过标头包含保护或#pragma once
完成的)。
class UIHandling : public exception
{
public:
UIHandling();
// ...
};
inline // << add this...
UIHandling::UIHandling()
{
}
对inline
的 cpp 偏好 ;
内联函数是具有以下属性的函数:
- 只要每个定义出现在不同的翻译单元中,程序中的内联函数就可以有多个定义。例如,可以在多个源文件中 #include 的头文件中定义内联函数。
- 内联函数的定义必须存在于调用它的翻译单元中(不一定在调用点之前)。
相关文章:
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 当类成员参数具有相同的名称时,如何定义构造函数?
- C++定义构造函数使对象成为非 POD
- 请描述一下在 c++ 中在此类中定义构造函数的方式?
- 不为 emplace() 定义构造函数的解决方法
- 已定义构造函数的构造函数无法识别
- 在自定义构造函数中的堆上创建指针
- c++ 17 中结构自动定义构造函数的规则是什么?
- Python 错误:在 SWIG 生成的C++模板化代码模块中没有定义构造函数
- unique_ptr看不到派生类的自定义构造函数
- 两种类型的定义构造函数有什么区别?第一个使用":",第二个用大括号(如函数)定义它
- 为什么一个非平凡的成员需要为同一类中的匿名联合定义构造函数
- 为其成员根据模板基类存在的类定义构造函数
- 如何在派生类上具有默认行为,而不是重新定义构造函数
- 在结构中定义构造函数
- 将从基类继承的构造函数与自定义构造函数混合使用
- 如何在模板类外部定义构造函数
- C 需要使用自定义构造函数的帮助
- 可以联合包含具有用户定义构造函数的类的对象
- 具有用户定义构造函数的非聚合类的值初始化