Tôi đang viết một số mã mà tôi cần phải có một biến lớp đó là một mảng tĩnh int. Tôi hiểu rằng tôi có thể làm điều này với một cái gì đó như thế này trong các tập tin tiêu đề, Ah:biến lớp mảng tĩnh "nhiều định nghĩa" C++
#ifndef A_H_
#define A_H_
class A
{
public:
static const int a[];
};
const int A::a[] = {1,2};
#endif
này chỉ hoạt động tốt nếu tôi sau đó bao gồm cả tiêu đề này chỉ trong một tập tin khác, một cái gì đó như sau, chính. 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;
}
Nhưng giả sử tôi cần lớp A của mình phức tạp hơn một chút và tôi cũng muốn có tệp A.cpp. Tôi sẽ giữ tập tin main.cpp của tôi giống nhau, nhưng sau đó thay đổi Ah như sau (Tôi vừa mới bổ sung thêm một chức năng, printA):
#ifndef A_H_
#define A_H_
class A
{
public:
void printA() const;
static const int a[];
};
const int A::a[] = {1,2};
#endif
Và sau đó trong tập tin 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;
}
Biên dịch Ao bằng gcc -o Ao -c A.cpp là tốt. Nhưng liên kết này khi biên dịch main.cpp (gcc -o atest main.cpp A.o) không thành công với "multiple definition of 'A :: a'".
Tôi đã xóa Internet để tìm giải pháp và tìm thấy những người có biến được khai báo trong tiêu đề của họ bị lỗi "nhiều định nghĩa" khi chúng bao gồm tiêu đề ở nhiều nơi và giải pháp dường như là khai báo biến extern trong tiêu đề, sau đó xác định nó trong chỉ một nguồn (không tiêu đề) tập tin nguồn. Nhưng tôi không thể tuyên bố một biến lớp cả tĩnh và extern, tôi có thể? Nếu tôi cố gắng, hoặc nếu tôi chỉ tuyên bố nó extern, tôi nhận được một cảnh báo về biến không được tĩnh (cũng là một "xung đột specifiers" lỗi khi tôi thử cả hai).
Vì vậy, câu hỏi của tôi: có thể có các biến lớp mảng tĩnh trong trường hợp tệp tiêu đề cần được bao gồm trong nhiều tệp nguồn không? Nếu vậy, làm thế nào?