C++:构造函数中的向量赋值错误

C++ : Vector assignment in constructor error

本文关键字:向量 赋值 错误 构造函数 C++      更新时间:2023-10-16

在我的程序中,我有以下类:

#ifndef CORNERS_H
#define CORNERS_H
#include <vector>
class Corners{
public:
    Corners();
    Corners( std::vector<unsigned short int>,std::vector<unsigned short int> );
    Corners( std::vector<unsigned short int>,std::vector<unsigned short int>,
            std::vector<unsigned short int>, std::vector<unsigned short int> );
    void set2Corners( std::vector<unsigned short int>,std::vector<unsigned short int> );
    void set4Corners( std::vector<unsigned short int>,std::vector<unsigned short int>,
            std::vector<unsigned short int>, std::vector<unsigned short int> );
    std::vector<unsigned short int> getA();
    std::vector<unsigned short int> getB();
    std::vector<unsigned short int> getC();
    std::vector<unsigned short int> getD();

private:
    std::vector<unsigned short int> colA;
    std::vector<unsigned short int> colB;
    std::vector<unsigned short int> colC;
    std::vector<unsigned short int> colD;
};
#endif // CORNERS_H

此类的默认构造函数如下所示:

Corners::Corners(){
    colA[RED] = 5;
    colA[GREEN] = 5;
    colA[BLUE] = 5;
    colB[RED] = 31;
    colB[GREEN] = 63;
    colB[BLUE] = 31;
    colC=colA;
    colD=colB;
}

红绿蓝是在另一个文件中定义的枚举。对于我的整个程序,我在构建时没有收到任何错误。当我想在我的主实例中制作类时,例如:

Corners start;

当我运行该程序时,它冻结并退出并显示错误"分段错误"。我不知道为什么会这样,有人知道吗?

量的长度为 0,因此无法分配给位置。您首先必须初始化它们的长度。

Corners::Corners()
   : colA(3)
   , colB(3)
   , colC(3)
   , colD(3)
{
    colA[RED] = 5;
    colA[GREEN] = 5;
    colA[BLUE] = 5;
    colB[RED] = 31;
    colB[GREEN] = 63;
    colB[BLUE] = 31;
    colC=colA;
    colD=colB;
}

甚至像Mooing Duck建议的那样。

Corners::Corners()
   : colA{5, 5, 5}
   , colB{31, 63, 31}
   , colC(colA)
   , colD(colB)
{}

.. 可以内联,就像他展示的那样。

但也许你应该切换到std::array<unsigned short int, 3>.使用using CustomArray=std::array<unsigned short int, 3>;这样你就不必每次都写那么长的定义。

编辑:正如User4581301所建议的那样,更好的是:

struct Color {
    unsigned short int Red;
    unsigned short int Green;
    unsigned short int Blue;
};

您的向量没有容量。使用下标运算符时,矢量不会自动调整大小。您可以在 colA 和 colB 上调用 resize(( 方法,并在设置值之前传入大于 {RED,GREEN,BLUE} 最大值的 resize(( 方法。例如,如果 BLUE 是枚举中最大的:

Corners::Corners() {
    colA.resize(BLUE + 1);
    colB.resize(BLUE + 1);
    colA[RED] = 5;
    colA[GREEN] = 5;
    colA[BLUE] = 5;
    colB[RED] = 31;
    colB[GREEN] = 63;
    colB[BLUE] = 31;
    colC=colA;
    colD=colB;
}