0

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

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),它会导致变量 mirrors 和 minpix 都变为 0,而 canvasfeed 保持不变,但这仅在 mirrors 等于 1 时。

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

问题是,我被引导相信将私有变量设为 const 意味着如果变量在任何时候发生更改,编译器都会抱怨,但在这种情况下它编译得很好,如果我说实话,虽然我不完全理解如何应该使用 const (几乎不使用)。

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

4

1 回答 1

0

我被引导相信将私有变量设为 const 意味着如果在任何时候变量被更改,编译器都会抱怨。

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

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


 mutable Point array[];

被称为 类型的不完整数组Point,它保证只存储单个元素。当您使用它来存储更​​多元素时,您最终会写入超出数组范围的内容,从而导致Undefined Behavior

你需要使用一个向量:

mutable std::vector<Point> array;
于 2013-04-18T15:45:21.493 回答