簡體   English   中英

錯誤:未命名類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM