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++ コンパイラをネイティブに使用しています。Point が (x,y) 形式の座標を保持する変数型である OpenCV ライブラリを使用しています。各数値を保持するためにメモリ内の十分なスペースを使用するだけなので、2 つの整数の場合、x では 4 バイト、y では 4 バイトになると思います。

私が抱えている問題は、コンストラクター宣言 (Pointarr()) の変数が適切に初期化されることです。これを確認しましたが、配列をゼロ値のロードで埋める fillarray(int) 関数を呼び出すと、(0, 0)、これにより、変数 mirrors と minpix の両方が 0 に変更されます。canvasfeed はそのままですが、これは mirrors が 1 に等しい場合のみです。

ここで、いくつか指定してみましょう。 mirrors が 1 の場合、fill 配列内のループが 1 回だけ実行されることに注意してください。これは、配列が 1 つの値 (1 つのポイント) しか持たないことを意味します。mirrors を 2 に設定すると、canvasfeed も 0 になります。fillarray 関数が、プライベート変数を保持するために使用されるのと同じメモリを配列に割り当てているため、プライベート変数が変更されていることは明らかだと思います。後で必要になるので、これは問題です。

問題は、プライベート変数を const にすることは、変数が変更された場合にコンパイラが文句を言うことを意味すると信じるようになりましたが、正直なところ、完全には理解していませんが、この場合は正常にコンパイルされます。 const を使用する必要があります (ほとんどありません)。

最後に問題は、配列が必要なこの他のメモリを使用するのを避けながら、ミラーと同じ量の要素スロットを持つように配列を初期化するにはどうすればよいかということです。

4

1 に答える 1