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: 1 つ以上の複数定義されたシンボルが見つかりました

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

ヘッダー ファイルで静的変数を定義しました。これは、静的ファイルが 1 回だけ含まれている場合にのみ機能します。しかし、それを 2 回含めました (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 に答える
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 に答える
0

Hader ファイルに定義を記述した場合、この定義は、このヘッダーを含む各オブジェクト モジュールで複製されます。そのため、リンカーは、使用する定義と、これらの定義が同等かどうかを認識しません。

于 2013-11-05T11:07:01.947 に答える