静态成员变量初始化问题。关于 error LNK2005 static int:已经在***.obj中定义

这两天一直做C++的内容,我在一个类里使用了一个静态成员函数,但是在使用的时候总是报错

比如这样子 

错误 1  error LNK2005: "public: static int c1::i" (?i@c1@@2HA) 已经在 c1.obj 中定义

根据我在网上查资料,主要原因有以下三种:

1.重复定义全局变量。

2.头文件的包含重复。

3.使用第三方的库造成的。

但是我的原因不属于刚才所提到的三种,我的程序代码并没有太多了.h文件,也没有复杂的包含关系。

大家都知道,在类里定义静态对象的时候,必须立刻在类外初始化,否则就会报错。给大家举个例子。

c2类是c1类的子类,如下:

c1.h

[cpp]  view plain  copy
  1. #pragma once  
  2. class c1  
  3. {  
  4. public:  
  5.     c1(void);  
  6.     ~c1(void);  
  7.     static int i;  
  8. };  
  9.   
  10. int c1::i=0;  
c1.cpp
[cpp]  view plain  copy
  1. #include "c1.h"  
  2. c1::c1(void)  
  3. {  
  4. }  
  5.   
  6.   
  7. c1::~c1(void)  
  8. {  
  9. }  

c2.h

[cpp]  view plain  copy
  1.   
[cpp]  view plain  copy
  1. #pragma once  
  2. #include "c1.h"  
  3. class c2 :  
  4.     public c1  
  5. {  
  6. public:  
  7.     c2(void);  
  8.     ~c2(void);  
  9. };  
c2.cpp
[cpp]  view plain  copy
  1. #include "c2.h"  
  2. c2::c2(void)  
  3. {  
  4. }  
  5.   
  6.   
  7. c2::~c2(void)  
  8. {  
  9. }  

我在c1.h后面立刻对静态变量i进行初始化,生成解决方案,然后报错

错误 1  error LNK2005: "public: static int c1::i" (?i@c1@@2HA) 已经在 c1.obj 中定义

错误 2  error LNK1169: 找到一个或多个多重定义的符号


只要两个或者以上的.cpp同时包含了一个定义了变量的.h文件,就会提示错误.


在网上查资料以后,在这里找到了答案,http://akheyun.blog.163.com/blog/static/138249276201062221452697/

有1.cpp和2.cpp, 1.cpp包含1.h, 2.cpp只包含2.h 但是2.h包含了1.h.. 所以1.h中定义的变量编译的时候会在2.cpp中有定义. 于是乎2.cpp翻译成的obj里也会有定义, 结果导致提示obj里重定义。

因此,我们要做的就是,不要在.h里面初始化静态成员变量,初始化静态变量的工作放到.cpp里面去完成

像这样就好了。

c1.cpp

[cpp]  view plain  copy
  1. #include "c1.h"  
  2.   
  3. int c1::i=0;  
  4. c1::c1(void)  
  5. {  
  6. }  
  7.   
  8.   
  9. c1::~c1(void)  
  10. {  
  11. }  
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这是一个链接错误,表示函数 "main" 已经在文件 "1hello world.obj" 定义过了。在 C++ 程序,每个程序都必须有一个名为 "main" 的函数,它是程序的入口点。如果在同一个程序多次定义了 "main" 函数,就会产生这个错误。 解决办法是: - 检查程序是否有多个文件定义了 "main" 函数,如果有,请将其一个删除。 - 检查程序是否有多次定义了 "main" 函数,如果有,请将多余的定义删除。 - 如果您是使用第三方库或组件时遇到这个错误,请检查是否存在重复的定义,并请联系库或组件的提供商寻求帮助。 ### 回答2: 这个错误是由于在同一个程序定义了多个名为"main"的函数导致的。 在C++,每个程序只能有一个入口函数"main"。当在同一个项目有多个源文件时,如果每个源文件都定义了一个名为"main"的函数,编译器就会报告LNK2005错误。 解决这个错误的方法是确保每个项目只有一个名为"main"的函数。可以检查项目是否存在多余的源文件或文件是否定义了多个"main"函数。如果有,可以删除多余的源文件或将额外的"main"函数重命名为其他名称。 另外,有时候这个错误可能是由于错误的链接选项导致的。可以检查项目配置的链接选项,确保没有重复的源文件被包含在链接过程。 总之,要解决LNK2005错误,需要确保每个项目只有一个名为"main"的函数,并且检查配置选项以确保正确的链接。 ### 回答3: 这个错误是由于在程序存在重复定义了main函数所导致的。 在一个C/C++程序,每个源文件只能有一个main函数,作为程序的入口点。当在多个源文件同时定义了main函数时,编译器在链接时就会报错,提示main函数已经在某个obj文件定义过了。 解决这个错误的方法有两种: 1. 删除重复的main函数定义:查找并删除多余的main函数定义,只保留一个即可。通常情况下,只需要在程序的一个源文件定义main函数即可。 2. 将重复定义的main函数改为其他名称:如果确实需要在多个源文件定义一个入口函数,可以将其一个main函数改名为其他不重复的函数名,然后修改调用该函数的地方。 总之,在解决这个错误时,需要确保整个程序只有一个main函数的定义,避免在多个源文件重复定义

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值