Я изучаю компьютерную графику и 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
}
Там была циклическая зависимость между Model
и ModelLoader
, и то, что я там был единственный способ, которым я может заставить его скомпилировать. Но, как вы можете видеть, этот вид побеждает цель деклараций внутри ModelLoader.hpp
, плюс дублированный код. Я все еще не очень хорош с C++ и объектно-ориентированным дизайном. Должен ли я просто пойти с тем, что у меня было раньше? Если я действительно хотел отделить загрузку файлов от бухгалтерии, как мне это сделать? Что случилось с моими попытками?
Что точка 'load', если он просто передает имя файла' конструктора model' в любом случае? – immibis
@immibis Нет, загрузка должна считывать манифест, загружать соответствующие двоичные файлы и буферизовать их. Таким образом, «Модель» отслеживает только объекты OpenGL. – Alex
Но с вашим дизайном здесь «Model :: Model» (конструктор) - это то, что делает чтение. – immibis