我有一个名为ImageMatrix的类,它以递归方式实现C ++映射;最终的结果是我有一个三维数组。
typedef uint32_t VUInt32;
typedef int32_t VInt32;
class ImageMatrix
{
public:
ImageMatrixRow operator[](VInt32 rowIndex)
private:
ImageMatrixRowMap rows;
};
typedef std::map <VUInt32, VInt32> ImageMatrixChannelMap;
class ImageMatrixColumn
{
public:
VInt32 &operator[](VUInt32 channelIndex);
private:
ImageMatrixChannelMap channels;
};
typedef std::map<VUInt32, ImageMatrixColumn> ImageMatrixColumnMap;
class ImageMatrixRow
{
public:
ImageMatrixColumn operator[](VUInt32 columnIndex);
private:
ImageMatrixColumnMap columns;
};
typedef std::map<VUInt32, ImageMatrixRow> ImageMatrixRowMap;
每个运算符只返回一个map-wrapper类,如下所示:
ImageMatrixRow ImageMatrix::operator[](VInt32 rowIndex)
{
return rows[rowIndex];
}
ImageMatrixColumn ImageMatrixRow::operator[](VUInt32 columnIndex)
{
return columns[columnIndex];
}
VInt32 &ImageMatrixColumn::operator[](VUInt32 channelIndex)
{
return channels[channelIndex];
}
基本上,当我将值设置为100,并将值测试为cout时,它显示为0,而不是我设置它的数字。
for (VUInt32 a = 0; a < GetRowCount(); a++)
{
for (VUInt32 b = 0; b < GetColumnCount(); b++)
{
for (VUInt32 c = 0; c < GetChannelCount(); c++)
{
VInt32 value = 100;
matrix[a][b][c] = value;
VInt32 test = matrix[a][b][c];
// pixel = 100, test = 0 - why?
cout << pixel << "/" << test << endl;
}
}
}
注意:我已经更改了此示例的原始代码,因此占用的空间更少,因此可能会出现一些语法错误(请不要指出它们)。
答案 0 :(得分:5)
以下运算符按值返回,没有写入修改实际数据。
ImageMatrixRow ImageMatrix::operator[](VInt32 rowIndex);
ImageMatrixColumn ImageMatrixRow::operator[](VUInt32 columnIndex);
使用:
ImageMatrixRow& ImageMatrix::operator[](VInt32 rowIndex)
ImageMatrixColumn& ImageMatrixRow::operator[](VUInt32 columnIndex)
答案 1 :(得分:1)
除了一个返回值之外的所有operator []函数 - 它们都应该返回引用。
答案 2 :(得分:1)
您的ImageMatrixRow
和ImageMatrixColumn
operator[]()
方法会返回副本,而不是referecencs。
答案 3 :(得分:0)
“每个都返回一个参考” - 你确定吗?
他们看起来像是返回存储的地图的副本,而不是对它们的引用。
尝试,例如:
ImageMatrixRow & ImageMatrix::operator[](VInt32 rowIndex)
请注意&
符号。