这可能是一件微不足道的事情,但我已经用谷歌搜索并尝试了所有可能的选项,但它不起作用。
我有一个带有 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>>
- 没有帮助根据伯特的提示,我找到了罪魁祸首 - 它是
operator=
。所以正确的应该是
Colour& Colour::operator=(Colour& c) {
return c;
}