c++ - 我怎样才能避免这种丑陋的嵌套类 C++ 代码

标签 c++ class oop nested shared-ptr

我使用 C++ 使用 SDL 编写游戏。我用 C 编写游戏已经一年多了,现在我已经用 C++ 编写了 7 个月。我试图避免几乎所有全局变量并转向所有权系统,其中每个对象都由其他对象拥有。这样我就可以管理具有 shared_ptr 成员的类的生命周期,几乎不用担心释放指针。

例如,我的游戏是一个类及其子系统。

class Game
{
public:
   Game();
   ~Game();
   void runFrame();

   std::shared_ptr<Display> display;
   std::shared_ptr<Audio> audio;
   std::shared_ptr<Save> save;
};

但我遇到了看起来很乱的嵌套类,例如下面的音频类。

class Audio
{
public:
   Audio(Game& parent);
   ~Audio();

   struct MusicFiles;
   struct SfxFiles;
   std::shared_ptr<MusicFiles> musicFiles;
   std::shared_ptr<SfxFiles> sfxFiles;

private:
   class Music
   {
   public:
      class File
      {
      public:
         File(Music& parent, std::string fileAddr);
         ~File();
         void play();
         void fadeIn();
         void stop();
      private:
         Music& _parent;
         std::string addr;
         Mix_Music* chunk;
      };

      Music(Audio& parent);
      ~Music();
      void setVolume();

   private:
      Audio& _parent;
      bool _enabled;
      int _volume;
   };

   class Sfx
   {
   public:
      class File
      {
      public:
         File(Sfx& parent, std::string fileAddr);
         ~File();
         void play();
         void stop();
      private:
         Sfx& _parent;
         std::string addr;
         Mix_Chunk* chunk;
         int channel;
      };

      Sfx(Audio& parent);
      ~Sfx();
      void setVolume();

   private:
      Audio& _parent;
      bool _enabled;
      int _volume;
   };

   Game& _parent;
   Music _music;
   Sfx _sfx;
};

我有嵌套类,因为我不喜欢在每个函数名称中写“Music”或“Sfx”,例如 setMusicVolume()、setSfxVolume()、setMusicHook()、setSfxHook() 等。 我可以拉出嵌套类,但 Music 和 Sfx 只需要存在于 Audio 类中。我宁愿重新组织一切并拥有更好的设计。

您有什么更好的设计建议吗?

最佳答案

将您的各种类(class)组织成一个 namespace将它们分组,而不是单个类。这东西一旦长大,就很难维护了。您希望使用您的类来封装 功能并为“外部世界”提供一个简单而全面的接口(interface)。通常,每个类都有自己的头文件(.h.hpp)和编译单元(.cpp)。

接受有 many good reasons使用 getter 和 setter 函数 - 它们是良好封装的基础。如果确实需要,您可以随时使用 friend class Audio在你的嵌套类中制作privateprotected成员对 Audio 可见,但不是您项目中可能(在将来的某个时候,也许)包含这些类的所有其他类。

你说你不喜欢写作audio.setMusicVolume(0.8f)而不是 audio.music.setMusicVolume(0.8f) .有人可能会说 audio.getMusic().setVolume(0.8f)将是一个很好的妥协,但是 Demeter不同意。通过使用像 setMusicVolume 这样的包装函数,其他所有类(class)只需要了解并与之交流Audio同时 Music是严格内部的,只有 Audio 知道本身。如果你使用函数链,你就失去了这个优势并暴露了Music。和 Sfx对世界 - 这不一定是坏事。如果你想坚持你的语法,我的建议是保持公共(public)接口(interface)非常小 and use friend Audio 公开更多功能,如果需要的话。

关于c++ - 我怎样才能避免这种丑陋的嵌套类 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28176371/

相关文章:

C++条件检查具有阈值的较低数字

c++ - C++中运算符<<的重新定义

c++ - 当用字符串文字实例化时,模板 T & 参数到底是什么?

swift - 创建主开关以更改所有背景颜色

python-3.x - 在 Python 中实现抽象类的最佳方法

oop - Actor 阵容永远不会成功

c++ - 用于嵌入式设备的 Qt Quick 控件 2.0

java - 打印具有 3D 数组字段的类

class - VSCode : search classes/go to class for imported libraries

java - 如何在 OOP 中实现图形层次结构