2015-12-09 2 views
0

Я работаю с OpenGL, и я пытаюсь создать простой наземный класс, который рисует прямоугольник.Инициализация массива заголовка C++ в конструкторе

У меня есть класс с именем Vertex:

class Vertex 
{ 
    public: 
     Vertex(
      glm::vec3 _position, 
      glm::vec3 _color = glm::vec3(0.0, 0.0, 0.0), 
      glm::vec3 _normal = glm::vec3(0.0, 1.0, 0.0), 
      glm::vec3 _texture = glm::vec3(0.0, 0.0, 0.0)); 

     void setNormal(glm::vec3 _normal); 
     void setTexture(glm::vec3 _texture); 
     virtual ~Vertex(); 
    protected: 
    private: 
     glm::vec3 position; 
     glm::vec3 color; 
     glm::vec3 normal; 
     glm::vec3 texture; 
}; 

И это мой Ground класс:

class Ground 
{ 
    private: 
    double widht; 
    double length; 
    double y; 
    int* indexes; 
    Vertex* vertices; 
    public: 
    Ground(double _width, double_length, double y); 
} 

И вот что я хочу сделать в конструкторе Ground:

this->indexes = {0, 3, 1, 1, 3, 2}; 
this->vertices = { 
     Vertex(glm::vec3(0 - width/2, y, 0-length/2)), 
     Vertex(glm::vec3(0 - width/2, y, 0+length/2)), 
     Vertex(glm::vec3(0 + width/2, y, 0+length/2)), 
     Vertex(glm::vec3(0 + width/2, y, 0-length/2)) 
    } 

Я получаю эту ошибку при компиляции:

error: cannot convert ‘<brace-enclosed initializer list>’ to ‘Vertex*’ 

Теперь я знаю, что я мог бы жестко запрограммировать все это, но я хочу решение для общего определения заголовка класса ClassX * и инициализации конструктора.

+0

Если вы используете указатель, вы должны выделить свою собственную память. Я предлагаю вам использовать вектор. –

+0

hmm ... Ну, я также пробовал с помощью int * this-> indexes = new int [6]; this-> indexes = {0, 3, 1, 1, 3, 2}; // это не сработало this-> indexes [0] = 0; это-> индексы [1] = 3; // и т. д. этот^работал, но я не понимаю, почему первый не сделал, и я хочу понять общую концепцию. Прошу научить меня, как выделить память, после чего я могу использовать циклы для инициализации – user1840302

ответ

2

вершины - это указатель вершин, а не массив. Вы можете либо сделать переменную-член массив фиксированного размера, либо создать массив типа Вершина в куче.

для первого пути что-то вроде этого:

const int NUM_VERTS = 4; 

class Ground{ 
. 
. 
. 
Vertex vertices[NUM_VERTS] 
. 
. 
. 
}; 

Или, если вы хотите несколько различных наземных объектов с переменным числом вершин, которые можно использовать шаблоны, но это вызовет большое разрастание кода и размер исполняемого файл. Не очень хорошая идея, но она является возможно

template<size n> 
class Ground{ 
. 
. 
. 
Vertex vertices[n]; 
. 
. 
. 

} 

иначе, конечно

vertices = new Vertex[4]; 
vertices[0] = Vertex(glm::vec3(0 - width/2, y, 0-length/2)); 
//etc 
. 
. 
. 
+0

, пытаясь это-> vertices = new Vertex [4]; заставляет следующую ошибку ground.cpp: В конструкторе «Земля :: Земля (двойная, двойная, двойная)»: ground.cpp: 25: 34: ошибка: нет соответствующей функции для вызова «Вершины :: Вершина() ' this-> vertices = new Vertex [4]; – user1840302

+0

@ user1840302 Это потому, что у вас нет конструктора по умолчанию.Напишите один, даже если это пустой Vertex() {}; –

+0

но у меня есть конструктор для Vertex: Vertex :: Vertex ( GLM :: vec3 _position, GLM :: vec3 _color, GLM :: vec3 _normal, GLM :: vec3 _texture) { this- > позиция = позиция; это-> цвет = _color; this-> normal = _normal; this-> texture = _texture; } с цветом, нормалью и текстурой, имеющей значения по умолчанию – user1840302

1

Изменение indexes (индексы) и vertices быть std::vector<int> и std::vector<Vertex> соответственно. Тогда вы можете написать:

Ground::Ground(double _width, double _length, double y) 
    : indexes{0, 3, 1, 1, 3, 2} 
    , vertices{ 
     Vertex(glm::vec3(0 - width/2, y, 0-length/2)), 
     Vertex(glm::vec3(0 - width/2, y, 0+length/2)), 
     Vertex(glm::vec3(0 + width/2, y, 0+length/2)), 
     Vertex(glm::vec3(0 + width/2, y, 0-length/2)) 
    } 
{ 
} 
Смежные вопросы