无法替换数组中的对象,但我可以修改其成员

问题描述 投票:0回答:1

这可能是一件微不足道的事情,但我已经用谷歌搜索并尝试了所有可能的选项,但它不起作用。

我有一个带有 2D Color 对象数组的 Canvas 类

class Canvas {
 private:
    bool within_range(int x, int y) const;
 public:
    int mWidth, mHeight;
    Colour **grid;
    Canvas(int w, int h) : mWidth(w), mHeight(h) {
        grid = new Colour*[mWidth];
        for (auto i=0; i<mWidth; i++) {
          grid[i] = new Colour[mHeight];
        }
    }
    ~Canvas() {
        for (auto i=0; i<mWidth; i++) {
            delete[] grid[i];
        }
        delete[] grid;
    }
    bool write_pixel(int x, int y, Colour);
    Colour* pixel_at(int x, int y);
    int to_ppt(const char *const path) const;
};

当我调用 write_pixel 时

bool Canvas::write_pixel(int x, int y, Colour c) {
    if (!within_range(x, y) ) return false;

    grid[x][y] = c;
    return true;
}

它不会改变网格[x][y]。 但如果我像这样单独设置每个成员

bool Canvas::write_pixel(int x, int y, Colour c) {
    if (!within_range(x, y) ) return false;

    grid[x][y].mRed = c.mRed;
    grid[x][y].mGreen = c.mGreen;
    grid[x][y].mBlue = c.mBlue;
    return true;
}

它现在神奇地起作用了......

有人可以解释一下我在这里缺少什么吗?

我使用

googletest
进行验证

#include "rain/basic.hpp"
#include <gtest/gtest.h>

TEST(Canvas, Create) {
    int w=4, h=5;
    Canvas c(w, h);

    for (auto i=0; i<w; i++) {
        for (auto j=0; j<h; j++) {
            EXPECT_EQ(c.grid[i][j].mRed, 0.0);
            EXPECT_EQ(c.grid[i][j].mGreen, 0.0);
            EXPECT_EQ(c.grid[i][j].mBlue, 0.0);
        }
    }
}

TEST(Canvas, WritePixel) {
    int w=4, h=5;
    Canvas canvas(w, h);

    bool res = canvas.write_pixel(1, 1, Colour(1.0, 2.0, 3.0));
    ASSERT_TRUE(res);
    ASSERT_TRUE(canvas.grid[1][1].mRed == 1);
    ASSERT_TRUE(canvas.grid[1][1].mGreen == 2);
    ASSERT_TRUE(canvas.grid[1][1].mBlue == 3);

    Colour *got = canvas.pixel_at(1, 1);
    ASSERT_NE(got, nullptr);
    EXPECT_TRUE( (*got) == Colour(1.0, 2.0, 3.0) );
}

我尝试过:

  • 使用
    Colour ***grid
    并取消引用指针 - 确实有效
  • 使用
    vector<vector<Colour>>
    - 没有帮助
  • 等等
c++ arrays c++11 memory memory-management
1个回答
0
投票

根据伯特的提示,我找到了罪魁祸首 - 它是

operator=
。所以正确的应该是

Colour& Colour::operator=(Colour& c) {
    return c;
}
© www.soinside.com 2019 - 2024. All rights reserved.