构造函数中的C++头数组初始化

C++ header array initialization in constructor

本文关键字:数组 初始化 C++ 构造函数      更新时间:2023-10-16

我正在使用OpenGL,我正在尝试制作一个绘制矩形的简单基础类。

我有一个课叫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);
}

以下是我想在地面建设者中做的事情:

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*数组头定义和构造函数初始化的解决方案。

顶点是一个顶点指针,而不是数组。您可以将成员变量设置为固定大小的数组,也可以在堆上创建Vertex类型的数组。

第一种方式是这样的:

const int NUM_VERTS = 4;
class Ground{
.
.
.
Vertex vertices[NUM_VERTS]
.
.
.
};

或者,如果您想要具有不同顶点数量的几个不同Ground对象,可以使用模板,但这会导致代码膨胀和可执行文件大小过大。不是一个好主意,但可能的

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
.
.
.

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))
    }
{
}