Почему моя реализация карты C ++ не хранит значения? - PullRequest
1 голос
/ 27 марта 2009

У меня есть класс 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;
        }
    }
}

Примечание. Я изменил исходный код для этого примера, чтобы он занимал меньше места, поэтому могут возникнуть некоторые синтаксические ошибки (не указывайте их).

Ответы [ 4 ]

5 голосов
/ 27 марта 2009

Следующие операторы возвращают значение, никакие записи не изменяют фактические данные.

ImageMatrixRow ImageMatrix::operator[](VInt32 rowIndex);

ImageMatrixColumn ImageMatrixRow::operator[](VUInt32 columnIndex);

Использование:

ImageMatrixRow& ImageMatrix::operator[](VInt32 rowIndex)


ImageMatrixColumn& ImageMatrixRow::operator[](VUInt32 columnIndex)
1 голос
/ 27 марта 2009

Ваши методы ImageMatrixRow и ImageMatrixColumn operator[]() возвращают копии, а не ссылки.

1 голос
/ 27 марта 2009

Все функции вашего оператора [], кроме одного возвращаемого значения - все они должны возвращать ссылки.

0 голосов
/ 27 марта 2009

«Каждый возвращает ссылку» - вы уверены в этом?

Похоже, они возвращают копии сохраненных карт, а не ссылки на них.

Попробуйте, например:

ImageMatrixRow & ImageMatrix::operator[](VInt32 rowIndex)

Обратите внимание на символ &.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...