2012-03-19 47 views
37

Tôi cố gắng để biên dịch 2 lớp trong C++ với lệnh sau đây:Biến C++ có bộ khởi tạo nhưng không đầy đủ?

g++ Cat.cpp Cat_main.cpp -o Cat

Nhưng tôi nhận được lỗi sau:

Cat_main.cpp:10:10: error: variable ‘Cat Joey’ has initializer but incomplete type

Có thể ai đó giải thích cho tôi điều này có nghĩa? Những gì các tập tin của tôi về cơ bản làm là tạo một lớp (Cat.cpp) và tạo một cá thể (Cat_main.cpp). Đây là mã của tôi nguồn:

Cat.cpp:

#include <iostream> 
#include <string> 

class Cat; 

using namespace std; 

int main() 
{ 
    Cat Joey("Joey"); 
    Joey.Meow(); 

    return 0; 
} 

Cat_main.cpp:

#include <iostream> 
#include <string> 

using namespace std; 

class Cat 
{ 
    public: 
     Cat(string str); 
    // Variables 
     string name; 
    // Functions 
     void Meow(); 
}; 

Cat::Cat(string str) 
{ 
    this->name = str; 
} 

void Cat::Meow() 
{ 
    cout << "Meow!" << endl; 
    return; 
} 
+1

Bạn không thể khai báo đối tượng cho các lớp có định nghĩa chưa được hiển thị. – iammilind

+0

Tôi làm cách nào để hiển thị? –

+3

@Ken: Bạn phải bao gồm tệp tiêu đề. –

Trả lời

33

Bạn sử dụng một tờ khai chuyển tiếp khi bạn cần một loại hoàn toàn.

Bạn phải có định nghĩa đầy đủ về lớp học để sử dụng nó.

Cách thông thường để đi về việc này là:

1) tạo ra một tập tin Cat_main.h

2) di chuyển

#include <string> 

class Cat 
{ 
    public: 
     Cat(std::string str); 
    // Variables 
     std::string name; 
    // Functions 
     void Meow(); 
}; 

để Cat_main.h. Lưu ý rằng bên trong tiêu đề tôi đã xóa using namespace std; và chuỗi đủ điều kiện với std::string.

3) bao gồm tập tin này trong cả hai Cat_main.cppCat.cpp:

#include "Cat_main.h" 
+0

Vì vậy, tôi không thể đưa định nghĩa lớp của mình vào một tệp khác? –

+0

@ Không, đó không phải là những gì tôi nói. Đọc lại câu trả lời. –

+0

Tôi có định nghĩa các hàm cho lớp trong tệp tiêu đề không? –

4

Bạn không thể định nghĩa một biến của một loại không đầy đủ. Bạn cần phải mang lại toàn bộ định nghĩa của Cat vào phạm vi trước bạn có thể tạo biến cục bộ trong main. Tôi khuyên bạn nên di chuyển định nghĩa của loại Cat thành tiêu đề và bao gồm nó từ đơn vị dịch có main.

+0

Vì vậy, tôi phải đặt lớp 'Cat' của tôi vào tệp bằng' main'? –

+4

@Ken: không, bạn phải đọc một cuốn sách giới thiệu về C++ nơi khái niệm về các tiêu đề và các tệp nguồn sẽ được giải thích. –

+1

@Ken: Tạo tệp tiêu đề với định nghĩa của lớp (và các vệ sĩ thích hợp), sau đó bao gồm cả tệp từ cat.cpp và cat_main.cpp. –

9

Nó không liên quan đến trường hợp của Ken trực tiếp, nhưng một lỗi như vậy cũng có thể xảy ra nếu bạn sao chép .h file và quên thay đổi #ifndef chỉ thị. Trong trường hợp này trình biên dịch sẽ chỉ bỏ qua định nghĩa của lớp nghĩ rằng đó là một sự trùng lặp.

+1

Nhận xét tuyệt vời, tôi nghĩ rằng nó bao gồm nguyên nhân thường gặp nhất của vấn đề. Điều này là do sao chép hoặc đổi tên tệp tiêu đề và quên về chỉ thị #ifndef là khó khăn trong khi các câu trả lời khác đã giải quyết việc quên thêm #include statement là một lỗi nhỏ. – Vlad

1

Tôi gặp lỗi tương tự và nhấn trang này trong khi tìm kiếm giải pháp.

Với lỗi này, lỗi này có thể xảy ra nếu bạn quên thêm bước QT_WRAP_CPP(...) trong bản dựng của mình để chạy trình biên dịch đối tượng meta (moc). Bao gồm tiêu đề Qt không đủ.

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