考虑以下代码(不完全是我正在使用的代码,只是为了突出问题)
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 (几乎不使用)。
所以最后的问题是,如何避免让阵列使用我需要的其他内存,但仍将其初始化为具有与镜像相同数量的元素插槽。