【发布时间】:2018-10-15 14:21:22
【问题描述】:
我在尝试编译我的代码时遇到了这个问题 我认为这可能是由包含彼此的头文件引起的。但据我所知,我的头文件没有发现任何问题
错误 LNK1169 一个或多个多重定义符号 找到 Homework2 D:\05Development\04 C_C++\C\DS Alg 类\Homework2\Debug\Homework2.exe 1
另外,还有一个错误告诉我函数 Assert() 已在别处声明。
错误 LNK2005 "void __cdecl Assert(bool,class std::basic_string,类 标准::分配器 >)" (?Assert@@YAX_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 已在 DataBase.obj Homework2 D:\05Development\04 中定义 C_C++\C\DS算法类\Homework2\Homework2\dbTest.obj 1
这是我的代码结构:
功能
void Assert(bool val, string s)
{
if (!val)
{
cout << "Assertion Failed!!: " << s << endl;
exit(-1);
}
}
在常量.h中
一个虚拟类 List 包括 Constants.h
#pragma once // List.h
#include "Constants.h"
数组列表包含List类,在AList类中调用Assert函数
#pragma once //AList.h
#include "List.h"
...
Assert((pos >= 0) && (pos < listSize), "Position out of range");
在DataBase 类中我创建了一个AList 成员
private:
AList<CData> set;
标题如下所示: #pragma 一次 #include "AList.h" #include "CData.h"
CData.h 看起来像这样:
#pragma once
class CData
{
private:
std::string m_name;
int m_x;
int m_y;
public:
CData(std::string str = "null", int x = 0, int y = 0) : m_name(str), m_x(x), m_y(y) {}
// Helper functions
const std::string& GetName() const { return this->m_name; }
const int& GetX() const { return this->m_x; }
const int& GetY() const { return this->m_y; }
};
【问题讨论】:
-
不要将代码放在头文件中,除非它是类定义中的内联代码或模板化代码。仅在 .cpp 文件中。这里
Assert函数实现不应该在Constants.h,只有声明应该在那里(void Assert(bool val, string s);)