2009-03-11 48 views
5

Chúc mừng mọi người.Khai báo đối tượng lớp trong tệp tiêu đề

Tôi dường như đang bị lừa trên một quỹ đạo nhưng tôi không thể tìm thấy giải pháp ở bất cứ đâu. Anywho, sẽ tiếp tục và giải thích.

Tôi có một chương trình bao gồm ba tệp; main.ccp, add.h, add.cpp.

Tôi tuyên bố lớp 'SA' trong add.h và có tất cả chức năng của tôi được định nghĩa trong add.cpp

additional.h

class SA { 
    ... 
public 
    int x; 
} Obj1, Obj2; 

main.ccp

#include "additional.h" 

int main() { 

    Obj1.x = 5; 

    ... 
} 

này cung cấp cho tôi lỗi liên kết khi biên dịch: lỗi LNK2005: "class SA Obj1" (? Obj1 @@ 3VSA @@ A) đã được xác định trong main.obj

Định nghĩa duy nhất của đối tượng xảy ra trong add.h, và không có nơi nào khác. Chương trình biên dịch chỉ tốt nếu khai báo các đối tượng trong chính và không phải là tiêu đề:

main.ccp

Vấn đề là tôi muốn sử dụng các đối tượng primarially trong add.cpp, nhưng vẫn cần để khởi tạo một số giá trị công khai thông qua main.cpp. Bất kỳ từ nào của sự khôn ngoan?

Trả lời

11

Khai obj1 và obj2 trong cpp của bạn thay vì ở .h

add.h

class SA { 
... 
public 
    int x; 
}; 

main.cpp

#include "additional.h" 

SA Obj1, Obj2; 

int main() { 

Obj1.x = 5; 

... 
} 

Nếu bạn muốn khai báo Obj1 và Obj 2 trong file .h của bạn, thêm extern trong file .h như vậy:

extern SA Obj1, Obj2; 

nhưng bạn nên khai báo các đối tượng trong một tập tin cpp trong dự án của bạn:

main.cpp

SA Obj1, Obj2; 

Lý do cho điều này là mỗi khi bạn đưa tệp .h, bạn khai báo Obj1 và Obj2. Vì vậy, nếu bạn bao gồm các tập tin .h hai lần, bạn sẽ tạo ra hai trường hợp của Obj1 và Obj2. Bằng cách thêm từ khóa extern, bạn đang nói với trình biên dịch rằng bạn đã tạo ra hai biến ở đâu đó trong dự án của bạn (tốt nhất là trong tệp .cpp).

+0

hoàn hảo. Cảm ơn bạn! – Raugnar

6

Sử dụng extern từ khóa. Khai báo các đối tượng công khai này dưới dạng extern trong tiêu đề, sau đó xác định các cá thể trong một trong các cpps.

Như thế này:

extern SA Obj1; // in header 

SA Obj1;// in any one (no more than one) cpp 
4

Bạn cũng có thể có các dòng mã sau đây trong tập tin tiêu đề của bạn:

static SA Obj1, Obj2; 

này sẽ tạo ra chỉ có 1 thể hiện của từng đối tượng tại thời gian chạy và ngăn chặn định nghĩa lại. Tuy nhiên, hãy nhớ rằng tất cả các tệp có tệp .h sẽ sử dụng cùng một cá thể của hai đối tượng đó, do đó bạn sẽ cần phải cẩn thận khi bạn truy cập chúng.

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