rai*_*lin 6 c++ static-members multiple-definition-error static-array
我正在编写一些代码,我需要一个类变量,它是一个静态int数组.我明白我可以在头文件中用这样的东西做这个,啊:
#ifndef A_H_
#define A_H_
class A
{
public:
static const int a[];
};
const int A::a[] = {1,2};
#endif
Run Code Online (Sandbox Code Playgroud)
如果我将此标题只包含在另一个文件中,如下所示,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;
}
Run Code Online (Sandbox Code Playgroud)
但是假设我需要我的A类有点复杂,我想要一个A.cpp文件.我将保持我的main.cpp文件相同,但然后更改如下(我刚刚添加了一个函数,printA):
#ifndef A_H_
#define A_H_
class A
{
public:
void printA() const;
static const int a[];
};
const int A::a[] = {1,2};
#endif
Run Code Online (Sandbox Code Playgroud)
然后在文件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;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc编译Ao -o Ao -c A.cpp很好.但是在编译main.cpp(gcc -o atest main.cpp Ao)时将其链接失败,并且"a :: a'的多重定义".
我一直在互联网上搜索解决方案,并发现在标题中声明变量的人在多个地方包含标题时会出现"多重定义"错误,解决方案似乎是在变量extern中声明标头,然后在只有一个源(非标头)源文件中定义它.但我不能声明一个静态和外部的类变量,可以吗?如果我尝试,或者我只是声明它是extern,我得到一个关于变量不是静态的警告(当我尝试两者时也是一个"冲突的说明符"错误).
所以,我的问题是:在头文件需要包含在多个源文件中的情况下,是否可以使用静态数组类变量?如果是这样,怎么样?
Luc*_*ore 18
您违反了一个定义规则.在实现文件中移动定义:
//A.cpp
#include "A.h"
const int A::a[] = {1,2};
Run Code Online (Sandbox Code Playgroud)
您正在使用的解决方案extern适用于非成员变量.在你的情况下a是一个类成员.
| 归档时间: |
|
| 查看次数: |
6404 次 |
| 最近记录: |