重载下标运算符和使用双指针?

时间:2011-04-08 07:17:51

标签: c++ double-pointer subscript-operator

我有以下需要使用的变量,并且必须在其周围编写我自己的包装器以进行赋值。我将超越赋值(因为我将不得不使用我的包装器)并且想要在我的包装器中重载下标操作符以便将它与双指针数组一起使用。我在代码中的意思是:

我有什么:

从图书馆的标题:

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
}

当然这不起作用,因为双指针返回一个指针,这不是我告诉它返回的,但返回*像素&也没有退货。只是为了满足我的好奇心,并帮助我理解为什么这是不可能的,有人可以告诉我如果能够实现这一点,为什么会这样呢?请记住,我还没有很好地理解指针(我知道它们如何工作的基础知识,但就是这样),我希望用它来扩展我的理解。

3 个答案:

答案 0 :(得分: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 ++中我们避免直接使用指针。您可以使用预先打包的标准结构。

答案 1 :(得分:0)

这更典型,对于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);
        }
    };

}

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

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

答案 2 :(得分:-1)