1

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

  1. main.obj : 错误 LNK2005: "public: static class std::basic_string,class std::allocator > B::b" (?b@B@@2V?$basic_string@DU?$char_traits@D@std@@ V?$allocator@D@2@@std@@A) 已经在 B.obj 中定义

  2. 致命错误 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;
}
4

5 回答 5

5

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

std::string B::b = "BBB";
于 2013-11-05T11:04:19.287 回答
3

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

于 2013-11-05T11:06:33.763 回答
1

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

那就不要那样做!

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

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

于 2013-11-05T11:30:36.060 回答
0

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

于 2013-11-05T11:07:01.947 回答
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; 
}

这里是你的解决方案

于 2013-11-05T11:10:41.887 回答