【问题标题】:How can I work with classes that depend on each other in separate header files?如何在单独的头文件中处理相互依赖的类?
【发布时间】:2015-01-21 04:01:03
【问题描述】:

我正在编写一个纸牌游戏程序。我已经用自己的文件(头文件和实现文件)编写了 gofish,现在我希望能够从纸牌游戏类中访问 gofish。

Go fish 继承自纸牌游戏类,因为它包含玩家列表和纸牌等内容。此外,纸牌游戏标头定义了纸牌结构。

所以我在我的 go fish 文件中#include 纸牌游戏文件。但现在我想做的只是在我的驱动程序中#include 纸牌游戏文件并从中访问 go fish(我稍后会添加扑克)。

问题是我不能在纸牌游戏类中#include go fish 文件,因为这会导致无限包含错误。

这里有一些示例代码来获取要点:

//card_games.h
class card_game{...};

//gofish.h
#include "card_games.h"
class gofish : public card_game{...};

这就是我想做的:

//main.cpp
#include "card_games.h"
//main function
{
      card_game *game;
      game = new gofish; 
}

但总的来说,它不将 gofish 识别为一个类。 那我该怎么办呢?

【问题讨论】:

  • 通过抽象来实现——抽象类或虚函数。基类不应该直接了解派生自它的类。这是一个非常耦合的实现,只会让自己呕吐。
  • 这是有道理的。谢谢。

标签: c++ include dependencies


【解决方案1】:

你需要在 main.cpp 中包含 gofish 文件

#include "gofish.h"

main 需要先了解它,然后才能在 main 中创建它。

【讨论】:

    【解决方案2】:

    在文件 card_games.h 的底部包含 gofish.h,然后您只需在 main() 上方包含 card_games.h。

    【讨论】:

      【解决方案3】:

      这就是我所做的。

      1. 移除了基类对 gofish 的了解。

      2. 我创建了一个新文件 (games.h) 以包含 gofish.h 并将其包含在我的主文件中。我这样做的原因是因为我将添加另一个游戏,因为这是一个任务,我的想法是我可能会添加更多游戏。

      现在,我可以在我的 gofish.h 中包含 cardgame.h 并从 games.h 中获取 gofish

      感谢大家的帮助。

      【讨论】:

        【解决方案4】:

        我能想到以下选项。

        1. main.cpp 添加#include "gofish.h"。当您想在您的程序中玩扑克时,请将#include "poker.h" 添加到main.cpp

        2. 实现factory pattern,您可以在其中使用字符串处理card_game*。然后,添加一个虚函数play。当您在工厂返回的对象上调用play 时,调用将被定向到正确的游戏。

        【讨论】:

          【解决方案5】:
          #include "gofish.h"
          

          您在 main() 上方执行此操作。这样你就可以访问 gofish 和 card_game 两个类。我同意这也是非常耦合的。你应该更多地分开它们,而不是让它们如此耦合。有很多方法可以解决它。取决于你的代码有多复杂。

          【讨论】:

            【解决方案6】:
            1. “无限包含错误”。只是想确保你知道“包含保护宏”,用这个包装你的所有标题,否则包含将是你不断的痛苦:
            
            
                #ifndef HEADERNAME_H_
                #define HEADERNAME_H_ 
                ...
                #endif // HEADERNAME_H_
            
            
            1. “我现在希望能够从纸牌游戏课程中获得围棋。” - 不,你不必这样做,它破坏了继承的整个想法。在您的示例中,您应该通过包含 gofish.h 来访问 gofish

            【讨论】:

              猜你喜欢
              • 2011-09-27
              • 1970-01-01
              • 2014-09-08
              • 1970-01-01
              • 1970-01-01
              • 2018-10-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多