2012-06-27 32 views
17

Vấn đề của tôi khá phổ biến Tôi biết nhưng tôi đã tìm kiếm và thử mọi giải pháp tôi đã tìm thấy và vẫn không hoạt động. Vì vậy, bất kỳ trợ giúp sẽ được đánh giá rất cao! =)Lỗi - sử dụng không hợp lệ khai báo loại/chuyển tiếp không đầy đủ

Cảm ơn trước!

Tôi có lỗi này ở biên soạn:

g++ -ISFML/include -Iclasses/ -W -Wall -Werror -c -o classes/Object.o classes/Object.cpp 
In file included from classes/Core.hh:18:0, 
     from classes/Object.hh:4, 
     from classes/Object.cpp:1: 
classes/MapLink.hh:9:1: error: invalid use of incomplete type ‘struct Object’ 
classes/MapLink.hh:6:7: error: forward declaration of ‘struct Object’ 
In file included from classes/Core.hh:19:0, 
     from classes/Object.hh:4, 
     from classes/Object.cpp:1: 
classes/Player.hh:9:1: error: invalid use of incomplete type ‘struct Object’ 
classes/MapLink.hh:6:7: error: forward declaration of ‘struct Object’ 
make: *** [classes/Object.o] Error 1 

Vì vậy, về cơ bản, tôi đã có một chứa chính (main.cpp)

#include "Core.hh" 

int  main(void) 
{ 
    ... 
} 

Dưới đây là file header chứa tất cả bao gồm tôi (Core .hh)

#ifndef __CORE_HH__ 
# define __CORE_HH__ 

#include ... 
#include "Object.hh" 
#include "MapLink.hh" 
#include "Player.hh" 

class Core 
{ 
    ... 
}; 

#endif /* __CORE_HH__ */ 

Và sau đó các tệp gây phiền toái cho tôi (Object.hh)

#ifndef __OBJECT_HH__ 
# define __OBJECT_HH__ 

#include "Core.hh" 

class Object 
{ 
    ... 
}; 

#endif /* __OBJECT_HH__ */ 

(MapLink.hh)

#ifndef __MAPLINK_H__ 
# define __MAPLINK_H__ 

#include "Core.hh" 

class Object; 

class MapLink : public Object 
{ 
    ... 
}; 

#endif /* __MAPLINK_H__ */ 

(Player.hh)

#ifndef __PLAYER_H__ 
# define __PLAYER_H__ 

#include "Core.hh" 

class Object; 

class Player : public Object 
{ 
    ... 
}; 

#endif /* __PLAYER_H__ */ 
+2

Bạn không nên sử dụng [tên riêng] (http://stackoverflow.com/questions/228783) để bảo vệ tiêu đề; nó có thể dẫn đến các vấn đề như http://stackoverflow.com/questions/3345159 –

+1

Đây là một giải pháp cho tình huống của riêng tôi với cùng một lỗi trong tiêu đề của bạn nhưng có thể không dành cho bạn: Tôi phải bao gồm tiêu đề của lớp đó theo khiếu nại trong cpp của tôi, nếu phương thức công khai của lớp được giới thiệu bởi một lớp khác. Tôi cũng có những phụ thuộc rất phức tạp và việc sử dụng hỗn hợp các tờ khai chuyển tiếp và bao gồm. Tôi đang viết nó ở đây nhiều hơn như một lưu ý hơn là một giải pháp kể từ khi bạn đã có một. – kakyo

Trả lời

11

Vấn đề # 1:
Bạn phải lấy được chỉ từ một lớp khai hoàn chỉnh, nếu không trình biên dịch sẽ không biết phải làm gì.
Xóa tờ khai chuyển tiếp class Object;.

Vấn đề # 2:
Bạn có một phụ thuộc vòng tròn khắp nơi:

  • Trong "Core.hh" bạn bao gồm "Object.hh", "MapLink.hh" và "Player.hh ".
  • Trong "Object.hh", "MapLink.hh" và "Player.hh", bạn bao gồm "Core.hh".

Bạn cần phải đảm bảo rằng mỗi lớp hoàn toàn bao gồm lớp mà nó kế thừa từ đó.
Tôi không chắc chắn các lớp học tương tác với nhau như thế nào, bạn nên cung cấp chi tiết đó trong câu hỏi.
tôi đoán là bạn cần phải sửa đổi vùi của bạn như sau:

  • Sửa "MapLink.hh" và "PlayerLink.hh" để họ bao gồm "Object.hh", không phải "Core.hh"
  • Sửa đổi "Object.hh" để nó không bao gồm "Core.hh".
+0

Không có tham chiếu với nhau trong Core.hh/Object.hh – Azuli42

+0

Tôi muốn nhận tất cả SFML bao gồm nhưng bạn nói đúng, bao gồm toàn bộ Core.hh là một ý tưởng tồi! Đang thử rằng – Azuli42

+1

Đó là tốt hơn nhiều! Cảm ơn u rất nhiều mister Eitan: D – Azuli42

1

Trình biên dịch phải biết giao diện đầy đủ của lớp để thừa kế. Trong trường hợp này, trình biên dịch không thể nhìn thấy đối tượng của bạn.Đó là cần thiết để bao gồm object.hh tập tin trong các file khác

+0

Cảm ơn bạn đã trả lời của bạn! xin lỗi, tôi quên đề cập đến rằng "Object.hh" đã được bao gồm trong Player.cpp và MapLink.cpp và vẫn nhận được lỗi đó! – Azuli42

0

theo bao gồm:

  1. Object.hh - __OBJECT_H__ được định nghĩa
  2. Core.hh - __CORE_H__ được định nghĩa
  3. MapLink.hh - bao gồm Core.hh, nhưng nội dung của tập tin đó không được bao gồm vì bước 2 và #ifndef.
  4. Player.hh - Tương tự như bước 3.

Vì vậy MapLink.hhPlayer.hh không nhận được để xem định nghĩa của Object trước khi bạn cố gắng để kế thừa từ nó, và bạn không thể kế thừa từ một lớp học chưa được xác định đầy đủ.

Để khắc phục: đặc biệt bao gồm tiêu đề của lớp mà bạn đang kế thừa từ đó.
Tức là, thêm #include "Object.hh" vào MapLink.hhPlayer.hh.

+0

Cảm ơn bạn đã trợ giúp! Nó cho cùng một lỗi .. Tôi không hiểu làm thế nào một cái gì đó đơn giản là đem lại cho tôi nhiều rắc rối! – Azuli42

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