在构造函数中初始化变量?

Lin*_*ney -1 c++ inheritance vector std glfw

我正在尝试使用向量作为成员字段来设置对象。我设置了构造函数,据我所知它确实初始化了这个成员变量,但是当我尝试访问向量时出现错误,除非我在对象的函数调用中初始化它。我收到一条警告说

C26495: Variable 'Engy::Graphics::Shape2D::m_vertices' is uninitialized. Always initialize a member variable (type.6).

问题是,我确实在我的构造函数中初始化了它。我缺少什么重要的东西吗?这是我的代码:

类声明(头文件)

class Shape2D:Object
        {
            protected:
                std::vector<Vector> *m_vertices;
                int type = GL_QUADS;
            public:
                Shape2D(std::vector<Vector> vertices);
                Shape2D();
                void draw();
                void setVector(int index, Vector value);
                Vector getVector(int index);
                void translate(double x, double y);
                void createVector(int i, double x, double y);
                void createVector(double x, double y);
                void addVector(Vector value);
        };
Run Code Online (Sandbox Code Playgroud)

方法声明(.cpp 文件)

Shape2D::Shape2D(std::vector<Vector> vertices)
{
    std::vector<Vector> m_vertices = vertices;
}
Shape2D::Shape2D()
{
    std::vector<Vector> *m_vertices = new std::vector<Vector>;
}

void Shape2D::setVector(int index, Vector value)
{
    //THIS PART RIGHT HERE IS WHAT I HAVE TO DO TO MAKE IT NOT CRASH, BUT I DONT WANT TO HAVE TO PUT THIS EVERYWHERE
    if (!m_vertices)
    {
        m_vertices = new std::vector<Vector>;
    }
    if (m_vertices->size() < index)
    {
        m_vertices->assign(index - m_vertices->size(), NULL);       
    }
    m_vertices->at(index) = value;
}
Run Code Online (Sandbox Code Playgroud)

对象创建

    //Rectangle is a subclass of Shape2D which calls the default constructor of Shape2D then runs calls to add the constructor inputs in (Let me know if you would like to see that code)
    Rectangle r(0.0, 0.0, 0.5, 0.0, 0.5, 0.5, 0.0, 0.5);
Run Code Online (Sandbox Code Playgroud)

谢谢你们!

R S*_*ahu 5

线

std::vector<Vector> m_vertices = vertices;
Run Code Online (Sandbox Code Playgroud)

不初始化成员变量。它初始化一个同名的函数局部变量。函数局部变量隐藏/隐藏成员变量。

最佳实践是使用成员初始化列表语法来初始化成员。

Shape2D::Shape2D(std::vector<Vector> vertices) : m_vertices(vertices)
{
}
Run Code Online (Sandbox Code Playgroud)

这将需要对您的课程进行一次更改。您将需要更改m_vertices为向量对象而不是指针。

std::vector<Vector> m_vertices;
Run Code Online (Sandbox Code Playgroud)

无论如何,这是一个很好的做法。