类成员函数在声明为const后更改类成员变量

时间:2013-04-18 15:40:59

标签: c++ memory opencv const

考虑下面的代码(不完全是我正在使用的,只是为了突出问题)

class Pointarr //creates an array of points which can be recalled by object
{
    public:
    Pointarr(int, int, bool);
    ~Pointarr(){};

    mutable Point array[];

    private:
    void fillarray(int) const;

    int const minpix;
    int const mirrors;
    bool const canvasfeed;
};

void Pointarr::fillarray(int mirrors) const
{
    Point zero(0,0);
    for(int i = 0; i < mirrors; i++)
    {
        array[i] = zero;
    }
}

Pointarr::Pointarr(Mat dt, int mpx, int mir, bool cf) : dot(dt), minpix(mpx), mirrors(mir), canvasfeed(cf)
{
    fillarray(mirrors);
}

我首先会得到一些东西,我在linux上本机使用gcc c ++编译器。我正在使用OpenCV库,其中Point是一个变量类型,它以格式(x,y)保存坐标。我相信它只是在内存中使用足够的空间来保存每个数字,因此对于两个整数,x为4字节,y为4字节。

我遇到的问题是构造函数声明中的变量(Pointarr())正确初始化,我确认了这一点,但是当我调用fillarray(int)函数时,该函数使用零值加载数组, (0,0),它会导致变量镜像和minpix都变为0,而canvasfeed保持不变,但这只是当镜像等于1时。

现在,让我们指定一些东西,你会注意到当镜像为1时,填充数组中的循环只运行一次,这意味着数组只有一个值(一个Point)。如果我将镜像设置为2,那么canvasfeed也会变为0.我认为很明显fillarray函数正在分配用于将我的私有变量保存到数组的相同内存,因此正在更改我的私有变量。这是一个问题,因为我以后需要它们。

问题是,我认为制作私有变量const意味着编译器会抱怨如果在任何时候变量都被更改但在这种情况下它编译得很好,如果我诚实但我不完全理解应该如何使用const(几乎不用)。

所以最后问题是,如何避免让数组使用我需要的其他内存,但仍然将其初始化为具有与镜像相同数量的元素插槽。

1 个答案:

答案 0 :(得分:0)

  

我认为制作私有变量const意味着如果在任何时候变量都被更改,编译器会抱怨。

要么你误解了,要么你被误解了。有很多种方法可以修改一个固有的const成员,编译器甚至可能无法检测到它。最终,虽然这会导致未定义的行为。

您是确保直接或间接永远不会修改固有const数据成员的人。


 mutable Point array[];

被称为Point类型的不完整数组,保证只存储单个元素。当您使用它来存储更​​多元素时,您最终会超出数组边界而导致未定义行为

您需要使用矢量:

mutable std::vector<Point> array;