我在B.h
头文件中定义了一个B类。 B有一个静态数据成员。我在头文件中的B类中定义了这个静态数据成员。但是当我构建它时,会发生错误。
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中定义
- 醇>
致命错误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;
}
答案 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;
}
这里是您的解决方案