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

C++ C++;构造函数中的头数组初始化,c++,arrays,declaration,C++,Arrays,Declaration,我正在使用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),

我正在使用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]
.
.
.
};
或者,如果您想要多个具有不同顶点数的不同地面对象,可以使用模板,但这将导致代码膨胀和可执行文件大小过大。这不是一个好主意,但这是可能的


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

第一种方式是这样的:

const int NUM_VERTS = 4;

class Ground{
.
.
.
Vertex vertices[NUM_VERTS]
.
.
.
};
或者,如果您想要多个具有不同顶点数的不同地面对象,可以使用模板,但这将导致代码膨胀和可执行文件大小过大。这不是一个好主意,但这是可能的


索引
(索引)和
顶点
分别更改为
std::vector
std::vector
。然后你可以写:

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

索引
(索引)和
顶点
分别更改为
std::vector
std::vector
。然后你可以写:

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

如果使用指针,则必须分配自己的内存。我建议你用向量。嗯。。。我也试过使用int*如下:this->index=newint[6];这->索引={0,3,1,1,3,2}//这不起作用->索引[0]=0;此->索引[1]=3;//这样做很有效,但我不明白为什么第一个没有,我想了解一般的概念。请教我如何分配内存,然后我可以使用循环初始化。如果你使用指针,你必须分配自己的内存。我建议你用向量。嗯。。。我也试过使用int*如下:this->index=newint[6];这->索引={0,3,1,1,3,2}//这不起作用->索引[0]=0;此->索引[1]=3;//这样做很有效,但我不明白为什么第一个没有,我想了解一般的概念。请教我如何分配内存,然后我可以使用循环初始化->顶点=新顶点[4];在构造函数'ground::ground(double,double,double)':ground.cpp:25:34:错误:调用'Vertex::Vertex()'时没有匹配函数->顶点=新顶点[4]@user1840302这是因为您没有默认构造函数。写一个,即使它是一个空顶点(){};但我确实有一个顶点的构造函数:顶点:顶点(glm::vec3_位置,glm::vec3_颜色,glm::vec3_法线,glm::vec3_纹理){this->position=position;this->color=_color;this->normal=_normal;this->texture=_texture;}带颜色,法线和纹理具有默认值,但如果需要参数,它不是默认构造函数。你至少需要为这个职位再提供一个职位。如果在现有构造函数中为position添加另一个默认参数,或者编写一个没有参数的新参数,如Vertex(){};它可以很好地工作,在调用new的时候,编译器找不到合适的构造函数尝试这个->顶点=新顶点[4];在构造函数'ground::ground(double,double,double)':ground.cpp:25:34:错误:调用'Vertex::Vertex()'时没有匹配函数->顶点=新顶点[4]@user1840302这是因为您没有默认构造函数。写一个,即使它是一个空顶点(){};但我确实有一个顶点的构造函数:顶点:顶点(glm::vec3_位置,glm::vec3_颜色,glm::vec3_法线,glm::vec3_纹理){this->position=position;this->color=_color;this->normal=_normal;this->texture=_texture;}带颜色,法线和纹理具有默认值,但如果需要参数,它不是默认构造函数。你至少需要为这个职位再提供一个职位。如果在现有构造函数中为position添加另一个默认参数,或者编写一个没有参数的新参数,如Vertex(){};在调用new的时候,编译器找不到合适的构造函数,它就可以正常工作了