C++同一头文件中Card类play方法提示Deck、Hand为未知类型如何解决
问题原因
- C++确实采用从上到下的顺序逐行解析文件内容。当编译器处理到Card类中play方法的
Deck&、Hand&参数时,Deck和Hand类还未在当前解析位置之前被声明,因此无法识别这两个类型,抛出对应报错。 - 你提到的无法将Card类后置的限制是合理的:Deck和Hand类中存在
vector<Card>类型的成员,容器存储自定义类型时需要该类型的完整定义,仅前置声明Card类无法满足该需求,因此Card类必须定义在Deck和Hand类之前。
解决方案
你只需要在Card类定义之前,补充Deck和Hand的前向声明即可。因为play方法的参数是引用类型,只需要让编译器知道Deck和Hand是存在的类类型即可,不需要完整定义,完整定义放在Card类之后也能正常工作。
修改后的完整cards.h代码如下:
// 补充前向声明,告知编译器这两个类后续会提供完整定义 class Deck; class Hand; class Card { private: // some private attributes public: // some public methods //..... void play(Deck& deck, Hand& hand); // 此时编译器可识别两个参数类型 }; class Deck { private: vector<Card> deckCards; public: // some public methods }; class Hand { private: vector<Card> handCards; public: // some public methods };
注意:play方法的实现需要放在cards.cpp文件中,此时三个类的完整定义都已经可见,不会出现编译问题。不要将play方法的内联实现直接写在Card类的定义内,内联实现需要参数类型的完整定义,会触发和原来一样的报错。
内容的提问来源于stack exchange,提问作者Patrick Youssef
相关产品推荐
相关产品推荐

