我正在编写一些代码,我需要有一个静态 int 数组的类变量。我知道我可以在头文件中使用类似的东西来做到这一点,啊:
#ifndef A_H_
#define A_H_
class A
{
public:
static const int a[];
};
const int A::a[] = {1,2};
#endif
如果我随后将此标头仅包含在另一个文件中,这很好用,如下所示,main.cpp:
#include "A.h"
#include <iostream>
using namespace std;
int main()
{
A myA;
cout << "0: " << myA.a[0] << endl;
cout << "1: " << myA.a[1] << endl;
}
但是假设我需要我的 A 类更复杂一些,并且我也想要一个 A.cpp 文件。我将保持我的 main.cpp 文件相同,但随后将 Ah 更改如下(我刚刚添加了一个函数 printA):
#ifndef A_H_
#define A_H_
class A
{
public:
void printA() const;
static const int a[];
};
const int A::a[] = {1,2};
#endif
然后在文件 A.cpp 中:
#include "A.h"
#include <iostream>
using namespace std;
void A::printA() const
{
cout << "Printing in A.cpp." << endl;
cout << "A.0: " << a[0] << endl;
cout << "A.1: " << a[1] << endl;
}
用 gcc -o Ao -c A.cpp 编译 Ao 没问题。但是在编译 main.cpp (gcc -o atest main.cpp Ao) 时链接它会失败,并出现“'A::a' 的多重定义”。
我一直在网上搜索解决方案,发现在标头中声明了变量的人在多个地方包含标头时会出现“多重定义”错误,解决方案似乎是在标头,然后仅在一个源(非标头)源文件中定义它。但是我不能同时声明静态和外部的类变量,可以吗?如果我尝试,或者如果我只是将它声明为 extern,我会收到关于变量不是静态的警告(当我同时尝试这两种方法时也会出现“冲突说明符”错误)。
所以,我的问题是:如果头文件需要包含在多个源文件中,是否可以使用静态数组类变量?如果是这样,怎么做?