[英]ERROR: does not name a type
我正在用C ++實現國際象棋游戲,其中一些類是“ Board”和“ Piece”。 從“ Piece”繼承的類有“ Rook”,“ King”等。
因此,一塊木板是一塊2D陣列,因此board.h中包含piece.h。
對於最近的開發(在實施動作方面),我想讓各個部分進入董事會。 所以在piece.h中,我包括board.h。
現在,這會產生上述錯誤。
一些代碼:
//Function in piece.h
#include "board.h"
bool Piece::move( int toX, int toY, bool enemyPawn, const Board & b )
Error: Board does not name a type Error: ISO C++ forbids declaration of ‘b’ with no type [-fpermissive]
在board.h
:放置class Board;
(帶有分號!)之前要include piece.h
。
在piece.h
:放置class Piece;
(帶有分號!),然后include board.h
。
通常,如果我在標題中定義一個類,則將class <classname>;
放進去class <classname>;
在文件頂部, 在任何上方包括 。
您具有所謂的循環依賴關系。 這兩個標頭都試圖互相包含,並且要么失敗(如果您有包含保護),要么無限循環(沒有保護)。 無論哪種方式,這種“前向聲明”都可以解決問題。
如果這些類之間的聯系是如此緊密,以至於無法解決問題,則您必須“取消”它們。 移動計件/主教/王/等功能的定義各自.cpp
文件(如果他們沒有的話),請確保頭只用board&
和board*
(而不是board
的值),然后更換#include "board";
帶class board;
。 這告訴編譯器存在“未知”板類型,並且可以通過指針和引用傳遞它。 然后piece.h
將沒有依賴項,並且可以正確地從任何文件中包含,例如board.h
。
由於move僅使用參考,因此您可以肯定地避免包含board.h,而僅向前聲明您的Class Board。 如果您真的需要對電路板有一定的了解,而對電路板也有一定的了解,則可以向Board聲明一個接口類(純抽象),並包含該接口而不是Board,以確保將Board派生自該接口– Martin現在編輯
這是一個循環依賴性。 我最近讀到的一個提示是,想象一下如何在一個頭文件中定義兩個類,以便彼此了解。 答案是,你不能。
要打破循環依賴關系,您需要對其中一個類使用前向聲明,而不要包括其頭文件。 而不是#include "board.h"
,而是執行class Board;
。
您可以使用pimpl模式:請參閱http://www.gotw.ca/gotw/024.htm
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.