2016-01-17 3 views
0

Я изучаю компьютерную графику и 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++ и объектно-ориентированным дизайном. Должен ли я просто пойти с тем, что у меня было раньше? Если я действительно хотел отделить загрузку файлов от бухгалтерии, как мне это сделать? Что случилось с моими попытками?

+0

Что точка 'load', если он просто передает имя файла' конструктора model' в любом случае? – immibis

+0

@immibis Нет, загрузка должна считывать манифест, загружать соответствующие двоичные файлы и буферизовать их. Таким образом, «Модель» отслеживает только объекты OpenGL. – Alex

+0

Но с вашим дизайном здесь «Model :: Model» (конструктор) - это то, что делает чтение. – immibis

ответ

1

Я бы рекомендовал несколько иной подход. Сделайте свой класс известным как сериализовать и десериализовать себя из потока.

Таким образом, вы можете использовать строковые потоки, потоки файлов, сетевые потоки и т.д.

Смежные вопросы