静态数组类变量"multiple definition" C++



我正在编写一些代码,我需要有一个静态 int 数组的类变量。 我知道我可以在头文件中使用类似的东西来做到这一点,A.h:

#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 文件。我将保持我的主文件相同.cpp但随后按如下方式更改 A.h(我刚刚添加了一个函数 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 A.o

-c A.cpp 编译 A.o 很好。但是在编译main.cpp(gcc -o atest main.cpp A.o(时链接它失败,并带有"'A::a'的多重定义"。

我一直在互联网上搜索解决方案,发现在标题中声明了变量的人在多个位置包含标头时会出现"多重定义"错误,解决方案似乎是在标头中声明变量 extern,然后仅在一个源(非标头(源文件中定义它。但是我不能同时声明静态和外部的类变量,可以吗?如果我尝试,或者如果我只是将其声明为 extern,我会收到有关变量不是静态的警告(当我尝试两者时,也是一个"冲突说明符"错误(。

所以,我的问题:在头文件需要包含在多个源文件中的情况下,是否可以拥有静态数组类变量?如果是这样,如何?

您违反了一个定义规则。在实现文件中移动定义:

//A.cpp
#include "A.h"
const int A::a[] = {1,2};

您引用的解决方案(带有 extern (适用于非成员变量。在您的情况下,a是类成员。

您应该从头文件中删除"const int A::a[] = {1,2};"行。将此定义行放在其中一个.cpp文件中。然后,您可以在需要的地方多次包含头文件。

相关内容

最新更新