我有一个 3D 数组的模板,但是当 Chunk 类型的变量(参见下面的 typedef)试图进行索引访问时,我在编译时遇到了问题。
template <typename T, int xMax, int yMax, int zMax>
class Volume {
public:
class HelperIndex3 {
public:
HelperIndex3(Volume& p, int xx, int yy) : parent(p), x(xx), y(yy) {}
T operator[] (int z) const {return parent.data[x][y][z];}
T& operator[] (int z) {return parent.data[x][y][z];}
private:
Volume& parent;
int x;
int y;
};
class HelperIndex2 {
public:
HelperIndex2(Volume& p, int xx) : parent(p), x(xx) {}
HelperIndex3 operator[] (int y) const {return HelperIndex3(parent, x, y);}
HelperIndex3 operator[] (int y) {return HelperIndex3(parent, x, y);}
private:
Volume& parent;
int x;
};
HelperIndex2 operator[] (int x) const {return HelperIndex2(*this, x);} //problem at this line
HelperIndex2 operator[] (int x) {return HelperIndex2(*this, x);}
private:
T data[xMax][yMax][zMax];
};
typedef Volume<unsigned char, 64, 64, 64> Chunk;
问题行似乎需要 HelperIndex2 构造函数中的 const Volume& p,我想这是有道理的,因为我正试图在其他地方使用 const Chunk - 但我不知道如何解决这个问题。如果我添加第二个构造函数,我是否应该维护两个父引用,一个是常量,另一个不是?我担心这会膨胀成一团糟。如果有人能解释处理这种情况的正确方法,我将不胜感激。
最佳答案
您不会绕过维护两组代理类。这完全类似于标准库容器的 iterator
和 const_iterator
嵌套类。
由于您要返回代理类的拷贝,因此包含对原始对象的可变引用的代理类不可能也用于对原始对象的仅常量访问,因此您无法绕过一些 两种方法。两者的语义不同:如果您拥有的只是代理类的一个实例,您必须能够知道它是允许修改访问还是只允许只读访问。
关于c++ - 当操作的变量是 const 时,如何修复括号/索引运算符重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8466730/