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

时间:2013-11-05 11:00:30

标签: c++

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

  
      
  1. main.obj:错误LNK2005:“public:static class   的std :: basic_string的,类   std :: allocator> B :: B”   (2 B @ @@乙2V?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V·   $ allocator @ D @ 2 @@ std @@ A)已在B.obj中定义

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

  4.   

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;
}

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

您需要将b的定义移至.cpp文件。

答案 2 :(得分:1)

  

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

然后就是不要那样做!

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

// 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; 
}

这里是您的解决方案