c++ - 我将如何分开这个类(class)?

标签 c++ oop opengl

我正在学习计算机图形学和 OpenGL,我使用 JSON list 文件从我自己的二进制格式加载模型以跟踪 Assets 。

我现在拥有的 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++ 和面向对象的设计。我应该继续我以前拥有的东西吗?如果我真的想把文件加载和记账分开,我应该怎么做呢?我的尝试有什么问题?

最佳答案

我推荐一种稍微不同的方法。让您的类知道如何从流中序列化和反序列化自身。

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

关于c++ - 我将如何分开这个类(class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34843486/

相关文章:

c++ - 分数结构数组

c# - 我们可以重载 MVC Controller 操作方法吗?

c# - 什么时候应该在 C# 中使用 out 和 ref 参数?

c# - 创建返回正则表达式匹配命令的类的最佳方法

c++ - OpenGl翻译

opengl - 将 vec3 乘以模型 View 矩阵

c++ - 来自其他类的 asio 计时器

c++ - 将字符串分配给 char 数组的列

performance - 为整个模型预计算纹理,OpenGL

python - std::reference_wrapper 是否类似于 python 的传递对象引用?