【问题标题】:static array class variable "multiple definition" C++静态数组类变量“多重定义”C++
【发布时间】:2012-05-30 03:11:30
【问题描述】:

我正在编写一些代码,我需要有一个静态 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,我会收到关于变量不是静态的警告(当我同时尝试这两种方法时也会出现“冲突说明符”错误)。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    您使用extern 引用的解决方案适用于非成员变量。在您的情况下,a 是班级成员。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多