我正在学习计算机图形学和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 ++和面向对象的设计仍然不太满意。我应该只跟以前一样吗?如果我真的想将文件加载与簿记分开,该怎么办?我的尝试怎么了?

最佳答案

我建议使用稍微不同的方法。使您的班级知道如何从流中对其进行序列化和反序列化。

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

10-08 17:35