静态数组类变量“多重定义”C ++

时间:2012-05-23 14:34:52

标签: c++ static-members multiple-definition-error static-array

我正在编写一些代码,我需要一个类变量,它是一个静态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文件。我将保持我的main.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,我会收到关于变量不是静态的警告(当我尝试两者时也是“冲突的说明符”错误。)

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

2 个答案:

答案 0 :(得分:17)

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

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

您正在使用extern提供的解决方案适用于非成员变量。在您的情况下,a是一个类成员。

答案 1 :(得分:7)

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