我将如何分离这个类

How would I separate this class?

本文关键字:分离 何分离      更新时间:2023-10-16

我正在学习计算机图形学和OpenGL,我用JSON清单文件从我自己的二进制格式加载模型来跟踪资产。

我现在拥有的Model类跟踪绘制它所需的OpenGL对象,以及处理3D模型文件的处理:

class Model
{
public:
    Model(const std::string &filename);
    // read the manifest
    // load the appropriate binary files
    // finally make the OpenGL objects this class keeps track of
    // ... etc, like draw()
private:
    // handles for various OpenGL objects
}

我想将文件处理与OpenGL图形内容的簿记分开,因为我觉得这对单个类来说责任太大了。我该怎么做呢?

我想过创建一个ModelLoader类,但我认为没有任何状态需要跟踪才能加载它。所以也许我应该让它成为 ModelLoader 命名空间中的一个函数。我玩了一下,但最终得到:

// ModelLoader.hpp
#include "Model.hpp"
namespace ModelLoader
{
    Model load(const std::string &filename);
}

// ModelLoader.cpp
#include "ModelLoader.hpp"
Model ModelLoader::load()
{
    return Model();
}

// Model.hpp
class Model;
namespace ModelLoader
{
    Model load();
};
class Model
{
    friend Model ModelLoader::load();
public:
    // ... etc, like draw()
private:
    Model(const std::string &filename); // accessible only through ModelLoader::load()
    // handles for various OpenGL objects
}

ModelModelLoader之间有一个循环依赖关系,我所拥有的是我能让它编译的唯一方法。但如您所见,这违背了 ModelLoader.hpp 内部声明的目的,而且它是重复的代码。我仍然不太擅长C++和面向对象设计。我应该继续我以前拥有的东西吗?如果我真的想将文件加载与簿记分开,我应该怎么做?我的尝试有什么问题?

我建议采用稍微不同的方法。 使类知道如何从流中序列化和反序列化自身。

这样,您就可以使用字符串流、文件流、网络流等。