1

使用する必要がある次の変数があり、割り当てのために独自のラッパーを作成する必要があります。私は割り当てを超えて (作成したこのラッパーを使用する必要があるため)、ダブルポインター配列で使用するために、ラッパーで添字演算子をオーバーロードしたいと考えています。コードでの意味は次のとおりです。

私が持っているもの:

ライブラリの指定されたヘッダーから:

typedef struct {        // A pixel stores 3 bytes of data:
    byte red;       //  intensity of the red component
    byte green;     //  intensity of the green component
    byte blue;      //  intensity of the blue component
} pixel;

typedef struct { 
    int   rows, cols;   /* pic size */
    pixel **pixels;     /* image data */
} image;

私のクラス(もちろんヘッダーに含まれています):

pixels& MyWrapper::operator[] (const int nIndex) {
    return Image.pixels[nIndex]; // where Image is of type image
}

もちろん、ダブルポインターはポインターを返すため、これは機能しません。これは、返すように指示しているものではありませんが、 *pixels& を返しても返されません。私の好奇心を満足させ、なぜこれが不可能なのかを理解するのを助けるために、誰かがこれを実装する方法を教えてもらえますか? 私はまだポインターをよく理解していないことを覚えておいてください (ポインターがどのように機能するかの基本は知っていますが、それだけです)、これを使用して理解を非常に広げたいと考えています。

4

3 に答える 3

1

そもそも二重間接化を使用している理由は明らかではありません。

がピクセルの配列への double ポインターである場合pixels、次のことができます。

pixels& MyWrapper::operator[] (const int nIndex) {
    return (*Image.pixels)[nIndex]; // where Image is of type image
}

pixelsが配列へのポインターの配列へのポインターである場合、2 つのインデックスが必要です。

pixels& MyWrapper::operator() ( int xIndex, int yIndex ) {
    return Image.pixels[yIndex][xIndex]; // where Image is of type image
}

ここでいくつかの奇妙なことが起こっています。

  • typedef class { } identifier良くないC++です。を使用しないと、クラスに名前がないため、スコープclass identifier { };外でメンバー関数を定義できません。class { }(他の問題の中でも。)
  • パラメータを type にする理由はありませんconst int。Plainintでも同じことができます。
  • 二重間接化の明らかな理由はありません。通常、C++ では、ポインターを直接使用することは避けます。代わりに使用できるパッケージ化された標準構造がおそらくあります。
于 2011-04-08T07:34:30.983 に答える
1

これは、C++ のより一般的な例です。

#include <vector>

namespace AA {

    class t_point {
    public:
        t_point(const size_t& X, const size_t& Y) : d_x(X), d_y(Y) {
        }
       const size_t& x() const { return this->d_x; }
        const size_t& y() const { return this->d_y; }

    private:   
        size_t d_x;
        size_t d_y;
    };

    class t_array {
    public:
        // abusive, but possible. prefer `at`
        const int& operator[](const t_point& idx) const {
            return this->at(idx.x(), idx.y());
        }

        const int& at(const t_point& idx) const {
            return this->at(idx.x(), idx.y());
        }

        const int& at(const size_t& x, const size_t& y) const {
            return this->d_objects[x][y];
        }
    private:
        // or use your c image representation...
        std::vector<std::vector<int> > d_objects;
    private:
        static const int& ctest(const t_array& arr) {
            const t_point pt(1, 2);
            return arr[pt];
            return arr.at(pt);
            return arr.at(pt.d_x, pt.d_y);
        }
    };

}

この場合に 1 つのインデックスを使用することの大きな問題は、すべての座標計算をクライアントにプッシュする一方で、アクセスしようとしているインデックス (ピクセル) が明確でないことです。それが単一のポインターである場合でも、問題をクライアントにプッシュしますが、予想通りにインデックスにアクセスできます。

with double... メモリ内のレイアウトは変化する可能性があり、必ずしも連続しているわけではありません。2D 配列やポイント (たとえば) ではなく、単一の値 (論理的には 1D 配列) として公開するのは設計が悪いだけです。

于 2011-04-08T08:47:10.757 に答える
-1

boost::multi_arrayを使用する

于 2011-04-08T07:40:16.787 に答える