C plus plus关于在头文件或源文件中定义静态数据成员

Posted

技术标签:

【中文标题】C plus plus关于在头文件或源文件中定义静态数据成员【英文标题】:C plus plus about defining static data member in header file or source file 【发布时间】:2013-11-05 11:00:29 【问题描述】:

我在 B.h 头文件中定义了一个 B 类。 B 有一个静态数据成员。我在头文件的 B 类中定义了这个静态数据成员。但是当我构建它时,会发生错误。

    main.obj:错误 LNK2005:“公共:静态类 std::basic_string,类 标准::分配器 > B::b" (?b@B@@2V?$basic_string@DU?$char_traits@D@std@@V? $allocator@D@2@@std@@A) 已经在 B.obj 中定义

    致命错误 LNK1169:找到一个或多个多重定义符号

B.h:

#ifndef _B_H
#define _B_H
#include <string> 
class B

public:
  B();
  ~B();
  static void showfunc();
  static std::string b;
;
std::string B::b = "BBB";
#endif

B.cpp:

#include <iostream>
#include <string>
#include "B.h"

using namespace std;

B::B()



B::~B()



void B::showfunc()

  cout<<b<<endl;


// main.cpp
#include <iostream>
#include "B.h"
using namespace std;

int main()

  B b_obj;  
  b_obj.showfunc();
  return 0;

【问题讨论】:

这不是问题,但是以下划线开头后跟大写字母 (_B_H) 的名称和包含两个连续下划线的名称保留供实现使用。不要使用它们。 【参考方案1】:

您在头文件中定义了一个静态变量。仅当静态文件仅包含一次时才有效!但是您将它包含了两次(main.cpp 和 B.cpp)。 将以下行移至 B.cpp 即可:

std::string B::b = "BBB";

【讨论】:

对不起,我不能,上面的人也给出了正确的答案。也许下次:)【参考方案2】:

您需要将b 的定义移动到.cpp 文件中。

【讨论】:

【参考方案3】:

我在头文件的 B 类中定义了这个静态数据成员。但是当我构建它时,就会发生错误。

那就别那么做了!

不要在标题中定义静态成员。您将在 #includes 标头的每个 TU 中引入定义。

改为在一个 TU中定义它们;最简单的方法是在 .cpp 文件中。

【讨论】:

【参考方案4】:
// B.h 
#ifndef _B_H
#define _B_H
#include <string> 
class B 
public:
   B();
   ~B();
   static void showfunc();
   static std::string b;
;
#endif

//B.cpp #include <iostream> 
#include <string>
#include "MyHeader1.h"
using namespace std; 
B::B() 
B::~B()

void B::showfunc()
   cout<<b<<endl;


// main.cpp 
#include <iostream> 
#include "MyHeader1.h" 
using namespace std; 
std::string B::b = "BBB"; 

int main()
   B b_obj;    
   b_obj.showfunc();
   return 0; 

这里是你的解决方案

【讨论】:

【参考方案5】:

如果您在 hader 文件中编写定义,则此定义将在包含此标头的每个对象模块中复制。所以链接器将不知道使用哪个定义以及这些定义是否等效。

【讨论】:

我明白了。谢谢。我将它的定义移到我的源文件中。

以上是关于C plus plus关于在头文件或源文件中定义静态数据成员的主要内容,如果未能解决你的问题,请参考以下文章

编译错误:“g++:尝试执行 'cc1plus' 时出错:execvp:没有这样的文件或目录”

存储类链接和内存管理(c prime plus)

C Primer plus 第一章复习题及其编程题

SQL*Plus中怎么执行多个*sql脚本文件

使用 Cilk Plus 数组表示法编译 C 文件

何时将静态函数定义放在 C 的头文件中?