我试图在C++领域找到自己的方式,现在越来越困惑.玩具应用程序是一个非常基本的OpenGL引擎.所以这是(我想简单)问题:我想处理不同顶点数据的网格,所以我有例如
struct Vertex
{
Vector3f position;
}
struct VertexN : public Vertex
{
Vector3f normal;
}
Run Code Online (Sandbox Code Playgroud)
现在我需要一个Mesh类,它保存数据并绘制它.我尝试过这样的事情:
template<class T>
class Mesh
{
public:
Mesh();
~Mesh();
void load(const T * vertices, int num);
void draw();
protected:
T * vertices_;
Run Code Online (Sandbox Code Playgroud)
};
必须以不同方式加载和绘制不同的顶点,这可以通过模板特化来完成.
我的问题是我喜欢有另一个包含Mesh对象实例的类,但显然不允许使用模板化的类成员.
我能想到的另一个解决方案是在Mesh中保存指向基础结构Vertex的指针,为所使用的Vertex类型传递一个标识符,然后在load()和draw()中使用switch语句以允许不同的实现.
完成此任务的最佳方法是什么?
任何帮助是极大的赞赏.
您可以使用继承和虚函数.例如:
class MeshBase
{
public:
virtual ~MeshBase() { }
virtual void draw() = 0;
};
template <typename T>
class Mesh : public MeshBase
{
public:
virtual void draw() { }
// ...
};
Run Code Online (Sandbox Code Playgroud)
使用此方法,您可以将指针存储MeshBase在容器中的基类中.
理想情况下,您可以使用指针容器,它将为您管理指针,或者您可以使用智能指针的容器(例如,a std::vector<std::shared_ptr<MeshBase> >,如果您的实现包括shared_ptr;如果没有,它可以在许多地方找到) .
我还建议将顶点存储在Mesh类中的容器中,而不是使用手动动态分配和内存管理.