【问题标题】:C++ header file class declarationC++头文件类声明
【发布时间】:2021-11-24 01:03:58
【问题描述】:

所以在我的 C++ 项目中,我有“cards.h”和“cards.cpp”文件,“cards.h”文件声明了 3 个类:Card、Deck、Hand

class Card {
 private:
       // some private attributes
 public:
       // some public methods
       //.....

       void play(Deck& deck, Hand& hand); // This method plays the card, removes it from the hand, and places it in the deck 
}

class Deck {
private:
       vector<Card> deckCards;
public:
       // some public methods
}

class Hand {
private:
       vector<Card> handCards;
public:
       // some public methods
}

编译器在“Deck”和“Hand”的播放方法中给我一个错误,错误“Unknown type name Deck”,“Unknown type name Hand”。它怎么看不到在同一个 .h 文件中声明的类? C++会从上到下读取文件吗?

  • 我也不能把 Card 类放在底部,因为 Deck 和 Hand 使用 Card
  • 我必须将所有 3 个类放在同一个文件中,即“cards.h”文件中。

【问题讨论】:

  • 您是否对标题中Card 下面列出的 2 个类使用前向声明?
  • C++ 被指定为允许single-pass compilation,因此几乎所有内容都按照在文件中的顺序读取和处理。 playDeckHand 可能没有被声明,因为它们在文件的后面。由于play 需要引用,因此您应该能够按照@drescherjm 的建议使用前向声明来解决此问题。如果这不起作用,您必须扩展问题以包含minimal reproducible example,以便我们可以准确地看到您所做的事情。
  • @drescherjm 不,我不是,我使用它并且它有效。不过这会给我带来一些问题吗?
  • @user4581301 感谢您的详细解释,前向声明工作正常
  • 这并没有解决问题,但Card 不应该知道DeckHand,而且他们都不应该重新安排牌组或手牌。那是另一门课,可能是Game

标签: c++ visual-c++ clion


【解决方案1】:

你是对的。 C++ 需要声明从上到下。 附带说明,您的类声明语法不正确。每个类都需要在最后一个右花括号之后用分号结束。我测试了你的例子,效果很好。

您可以将这些类分离到它们自己的文件中并使用前向类声明,因为每个类都需要另一个类。或者您可以将它们保留在同一个文件中,并在使用前添加前向类声明。如下所示。

#include <vector>
using namespace std;

class Deck;
class Hand;

class Card {
private:
    // some private attributes
public:
    // some public methods
    //.....

    void play(Deck& deck, Hand& hand) {}; // This method plays the card, removes it from the hand, and places it in the deck 
};

class Deck {
private:
    vector<Card> deckCards;
public:
    // some public methods
};

class Hand {
private:
    vector<Card> handCards;
public:
    // some public methods
};

【讨论】:

  • 我认为问题是缺少分号。实际的问题是卡牌在声明之前需要牌组和手牌。您可以使用前向类声明来解决此问题。
  • 分号是缺少的字符。
  • 我的代码中实际上有分号,我忘了把它粘贴在这里。但是,是的,前向声明有效,谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多