5

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?

Trả lời

17

Bạn đang vi phạm một quy tắc định nghĩa. Di chuyển các định nghĩa bên trong một tập tin thực hiện:

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

Các giải pháp bạn đang reffering đến, với extern, áp dụng đối với các biến phi thành viên. Trong trường hợp của bạn a là một thành viên của lớp học.

7

Bạn nên xóa "const int A :: a [] = {1,2};" dòng từ tệp tiêu đề. Đặt dòng định nghĩa này vào một trong các tệp .cpp của bạn. Sau đó, bạn có thể đưa tệp tiêu đề nhiều lần vào nơi bạn cần.

Các vấn đề liên quan