静态成员变量的初始化,以及可能引发的multiple define问题
先说个人问题的解决方式:不要再头文件中定义静态成员变量
示例
// test.h
#ifndef TEST_H_
#define TEST_H_
class hh{
static int s;
int i;
}
int hh::s;// 这里非常容易引发multiple define
#endif
如果程序不复杂只有一个类无所谓在哪里定义了。
如果程序中比较复杂有类之间包含等等,就会非常容易出现multiple define问题。
错误示例
// son.h
#ifndef SON_H_
#define SON_H_
class son {
public:
int j;
static int s;
void printinfo();
};
int son::s;
#endif
// son.cpp
#include "son.h"
#include <iostream>
void son::printinfo(){
std::cout<< s << " " << j << std::endl;
}
// parent.h
#ifndef PARENT_H_
#define PARENT_H_
#include "son.h"
class parent{
public:
son s_;
int i;
void printsoninfo();
};
#endif
// parent.cpp
#include "parent.h"
void parent::printsoninfo(){
s_.printinfo();
}
// main.cpp
#include "parent.h"
int main()
{
parent p;
p.printsoninfo();
return 0;
}
编译就会包multiple defined
$$$$$$ g++ --std=c++11 son.cpp parent.cpp main.cpp -o test
/tmp/ccRvoLWL.o:(.bss+0x0): multiple definition of `son::s'
/tmp/ccybTDI7.o:(.bss+0x0): first defined here
/tmp/ccAFIodq.o:(.bss+0x0): multiple definition of `son::s'
/tmp/ccybTDI7.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
推荐定义的地方:
定义在.cpp或main.cpp中,这样文件就会解决啦