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

目前尚不清楚为什么您首先使用双重间接。

如果pixels是指向像素数组的双指针,则可以

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

如果pixels是指向数组指针数组的指针,那么您需要两个索引:

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 { }范围之外定义成员函数。(以及其他问题。)
  • 没有理由制作参数类型const int。平原int完成了同样的事情。
  • 双重间接没有明显的原因。通常在 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);
        }
    };

}

在这种情况下使用一个索引的大问题是不清楚您尝试访问哪个索引(像素),同时将所有坐标计算推到客户端。如果它是单个指针,您仍然会将问题推送到客户端,但您可以预测地访问索引。

使用双...内存中的布局可能会有所不同,它不一定是连续的。将其作为单个值(逻辑上,作为一维数组)而不是二维数组或点(例如)发布只是一个糟糕的设计。

于 2011-04-08T08:47:10.757 回答
-1

使用boost::multi_array

于 2011-04-08T07:40:16.787 回答