fatal error LNK1169: 找到一个或多个多重定义的符号

destory27 2017-10-03 03:56:06
#ifndef _VALUAT_H
#define _VALUAT_H
class Valuat
{
public:
Valuat();
~Valuat();

virtual void LabourCosts(int day) = 0;
};

#endif


#ifndef _LABOURCOST_H
#define _LABOURCOST_H

#include "Valuat.h"
class LabourCost:public Valuat
{
public:
LabourCost();
~LabourCost();
float getLabourCost()const;
void LabourCosts(int day);
static const float univolue;
private:
float Cost;
};
const float LabourCost::univolue = 240.0;


#endif


#include <iostream>
#include "Valuat.h"
#include "LabourCost.h"

using namespace std;

int main(void)
{

return 0;
}


问题:
1>Main.obj : error LNK2005: "public: static float const LabourCost::univolue" (?univolue@LabourCost@@2MB) 已经在 LabourCost.obj 中定义
1>G:\VisualStudio2015\C++\base\ValuationSoftware\Debug\ValuationSoftware.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
...全文
1529 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
srhouyu 2017-10-03
  • 打赏
  • 举报
回复 1
引用 2 楼 destory27 的回复:
放到 cpp中就对了,,,能说下原因吗? O(∩_∩)O谢谢
在一个程序里面,声明允许多次出现,但是定义不允许多次出现。 main.cpp由于包含了LabourCost.h,所以编译结果中有了univolue的定义。 LabourCost.cpp也包含了LabourCost.h,所以编译结果中又有了univolue的定义。 为什么无法避免LabourCost.h多次被引用呢,因为编译阶段是以.cpp为单位分别独立编译的,编译一个.cpp时候根本不会去看另一个,当然不可能知道另一个cpp是否涉及#define了任何东西。 #ifndef什么的,只能确保在一个.cpp为基础的那块里面不重复包含。所以每个.cpp的编译阶段都不会出现重复包含的问题。 到了链接阶段,会将多个编译结果进行统合。此时才会发现因重复包含而造成的重复定义,出现LNK2005错误。 为了避免同一个.h被不同的.cpp包含时的重复定义问题,建议在.h中只写声明,不写定义。
destory27 2017-10-03
  • 打赏
  • 举报
回复
放到 cpp中就对了,,,能说下原因吗? O(∩_∩)O谢谢
冬南风 2017-10-03
  • 打赏
  • 举报
回复
const float LabourCost::univolue = 240.0; 放到cpp里面吧。

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧