我该如何分开这门课程?

时间:2016-01-17 20:49:28

标签: c++ oop opengl

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

1 个答案:

答案 0 :(得分:1)

我建议采用略有不同的方法。让您的课程知道如何从流中序列化和反序列化。

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