2017-04-06 3 views
0

私はシンプルな3Dソフトエンジンを記述しようとしているが、私は少し問題を持っているを定義することなく、オブジェクトの配列。..3Dソフトエンジン:テンプレート引数リスト

私は頂点が含まれていMeshと呼ばれるクラスを持っていますエッジデータ:次いで

struct Vertex { float x, y, z; }; 
struct Edge { int from, to; }; 

template <int vs, int es> 
class Mesh { 
    public: 
     Vertex vertices[vs]; 
     int vSize = vs; 
     Edge edges[es]; 
     int eSize = es; 
}; 

キューブの頂点およびエッジデータを指定Cubeと呼ばれる派生クラス(I後でコースの複数の形状を追加します):

class Cube : public Mesh<8, 12> { 
public: 
    inline Cube() { 
     Vertex v[] = { 
      { -1.0f, -1.0f, -1.0f }, 
      { 1.0f, -1.0f, -1.0f }, 
      { 1.0f, 1.0f, -1.0f }, 
      { -1.0f, 1.0f, -1.0f }, 
      { -1.0f, -1.0f, 1.0f }, 
      { 1.0f, -1.0f, 1.0f }, 
      { 1.0f, 1.0f, 1.0f }, 
      { -1.0f, 1.0f, 1.0f } 
     }; 
     for (int i = 0; i < 8; i++) 
      this->vertices[i] = v[i]; 
     Edge e[] = { 
      { 0,1 },{ 1,2 },{ 2,3 },{ 3,0 }, 
      { 4,5 },{ 5,6 },{ 6,7 },{ 7,4 }, 
      { 0,4 },{ 1,5 },{ 2,6 },{ 3,7 } 
     }; 
     for (int i = 0; i < 12; i++) 
      this->edges[i] = e[i]; 
    } 
}; 

そして、このエラーを得Cube以降Triangleなどを保持することができるはずMesh親クラスの配列を持っているEngine呼ばその後クラス..

template <int w, int h, int mSize> 
class Engine { 
    private: 
     int width = w; 
     int height = h; 
     Mesh meshes[mSize]; <-- problem 
     int mCount = 0; 
     byte fBuffer[w][h]; 
     byte bBuffer[w][h]; 
    public: 
     inline Engine() {}; 
     inline void addMesh(Mesh mesh) { this->meshes[this->mCount++] = mesh; } 
}; 

Engine.h: 19:3: error: invalid use of template-name 'Mesh' without an argument list 
    Mesh* meshes = new Mesh[m] 

Engine.h: 25:23: error: 'Mesh' is not a type 
    inline void addMesh(Mesh mesh) { this->meshes[this->mCount++] = mesh; } 

Mesh meshes[mSize];にはMesh<a, b>の値が含まれているはずですが、私はそれが可能な限りMeshであることを知っているからです。

これを保存するにはどうすればよいでしょうか?

答えて

0

ここで達成しようとしているものに対してテンプレートを使用する必要はありません。では、Mesh.verticesとMesh.edgesをstd::vectors(たとえば)と宣言し、派生オブジェクトを構築するときにそれらを埋めるのはなぜですか?あなたがそれを得ることができるので、あなたは、これらのベクトルの大きさを保存する必要はありません

#include <vector> 

class Mesh { 
public: 
    std::vector<Vertex> vertices; 
    std::vector<Edge> edges; 
}; 

class Cube : public Mesh { 
public: 
    Cube() { 
     // Following stuff is only allowed since c++11 
     // But there's other tricks for vector's initializations before c++11 
     this->vertices = { 
      { -1.0f, -1.0f, -1.0f }, 
      { 1.0f, -1.0f, -1.0f }, 
      { 1.0f, 1.0f, -1.0f }, 
      { -1.0f, 1.0f, -1.0f }, 
      { -1.0f, -1.0f, 1.0f }, 
      { 1.0f, -1.0f, 1.0f }, 
      { 1.0f, 1.0f, 1.0f }, 
      { -1.0f, 1.0f, 1.0f } 
     }; 
     this->edges = { 
      { 0,1 },{ 1,2 },{ 2,3 },{ 3,0 }, 
      { 4,5 },{ 5,6 },{ 6,7 },{ 7,4 }, 
      { 0,4 },{ 1,5 },{ 2,6 },{ 3,7 } 
     }; 
    } 
}; 

注:これと同様に

std::vector<T>.size()Mesh.edges.size()

は精通していることを確認しますあなた自身を作成する前に、STLからテンプレートオブジェクト;)

(事実では、ここにあなたのクラスは、構造体でなければなりません...しかし、それは私が...推測する問題の範囲外である)

+0

の配列としてmeshesを定義すると言う、あなたはMeshためではない - テンプレートベースを追加することができたとし私が知っているように 'std:vector'はそこでは利用できません。 –

+1

したがって、頂点と辺をポインタとして宣言し、cスタイル( 'malloc')またはC++スタイル(' this-> vertices = new Vertex [NUMBER_OF_VERTICES] ')を使用して派生クラスでそれらを割り当てる必要があります。 this-> vertices'を 'free'または' delete []することを忘れないでください!さらに、あなたのデータがヒープに格納されるように、私はそれがあなたがメッシュを格納するために望むものだと思います。 – DendyTheElephant

+0

ありがとう!正確に私が必要なもの: –

1

私はArduinoの上でこれを実行し、限りだmBase

struct mBase { }; 

template <std::size_t vs, std::size_t es> 
struct Mesh : public mBase 
{ }; 

mBase

mBase meshes[mSize]; // <-- no more problem 

void addMesh(mBase mesh) { this->meshes[this->mCount++] = mesh; } 
+0

ありがとう!これはかなり簡単な解決策です! –

関連する問題