C ++:构造函数错误

时间:2017-03-22 18:33:25

标签: c++ vector constructor

在我的课程中我有以下课程:

#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;

}

RED GREEN BLUE是另一个文件中定义的枚举。 对于我的整个程序,我在构建时没有错误。 当我想在我的主要中创建类的实例时,例如:

Corners start;

当我运行该程序时,它冻结并退出并出现错误“Segmentation fault”。我不知道为什么会这样,有没有人有任何想法?

2 个答案:

答案 0 :(得分:2)

the vectors are length 0, so you cannot assign to locations. You first have to initialize their length.

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;
}

Or even like Mooing Duck suggested.

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

.. which could be inlined, like he shows.

but maybe you should switch to std::array<unsigned short int, 3>. And use using CustomArray=std::array<unsigned short int, 3>; so you don't have to write that long definition every time.

edit: and as user4581301 suggests, even better is:

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

答案 1 :(得分:0)

你的载体没有容量。使用下标运算符时,向量不会自动调整大小。您可以在colA和colB上调用resize()方法,并在设置值之前传入大于{RED,GREEN,BLUE}的最大值。例如,如果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;
}