我使用 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
在你的嵌套类中制作private
和 protected
成员对 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/