类Block
中有一个Map
的二维数组。我需要一种方法来更改类value
中的变量Block
。
class Block
{
Block(BlockValue blockValue = BLANK);
//first solution
void Block::setValue(BlockValue blockValue, Map &map);
void setImage(BlockValue blockValue, int n = 0);
//the value to be changed
BlockValue value;
static std::vector< std::vector<sf::Image> > images;
...
};
class Map
{
std::vector< std::vector<Block> > blocks;
//second solution
void setBlockValue(BlockValue blockValue, int i, int j);
...
};
我可以想到两个解决方案:
我在课程Block::setValue(BlockValue blockValue, Map &map)
中创建Block
,并通过以下方式从Map
调用它:
blocks[i][j].setValue(blockValue, this);
我在类setBlockValue(BlockValue blockValue, int i, int j)
中创建了一个Map
方法。这个解决方案的问题是我不能将我的构造函数用于Block
:
Block::Block(BlockValue blockValue) { setValue(blockValue); }
您会推荐哪种解决方案?
编辑:我忘了提到该方法可以访问Block
的数组很重要。这就是我将Map &map
包含在第一个方法的参数列表中的原因。我为这个可怕的错误道歉。
答案 0 :(得分:2)
你的问题不是很清楚,从清晰的角度来看,我将两者结合起来。 e.g。
class Block
{
public:
// setter to set the block value
void setValue(BlockValue blockValue);
private:
//the value to be changed
BlockValue value;
};
并且在Map
中有一种方法可以为特定位置设置BlockValue
class Map
{
public
void setBlockValue(BlockValue blockValue, int i, int j)
{
blocks[i][j].setValue(blockValue); // call the specific setter
}
private:
std::vector< std::vector<Block> > blocks;
};
答案 1 :(得分:1)
您可以通过以下方式减少代码行数并提高效率:
class Map
{
std::vector< std::vector<Block> > blocks;
...
Block& block(int i, int j) {
return blocks[i*num_cols + j];
}
};
返回引用将允许调用者使用赋值
mymap.block(i, j) = ...;
将使您免于提供单独的阅读和写作调用。
答案 2 :(得分:0)
我认为第一种解决方案更灵活。 如果Block会将其自行映射到地图,则可以在插入前插图或插入插入时刻执行所需操作。