成员数组包含类的实例。无法决定在何处放置修改此类变量的方法

时间:2011-10-26 21:51:15

标签: c++ data-structures

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);

     ...
 };

我可以想到两个解决方案:

  1. 我在课程Block::setValue(BlockValue blockValue, Map &map)中创建Block,并通过以下方式从Map调用它:

    blocks[i][j].setValue(blockValue, this);

  2. 我在类setBlockValue(BlockValue blockValue, int i, int j)中创建了一个Map方法。这个解决方案的问题是我不能将我的构造函数用于Block

    Block::Block(BlockValue blockValue) { setValue(blockValue); }

  3. 您会推荐哪种解决方案?

    编辑:我忘了提到该方法可以访问Block的数组很重要。这就是我将Map &map包含在第一个方法的参数列表中的原因。我为这个可怕的错误道歉。

3 个答案:

答案 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会将其自行映射到地图,则可以在插入前插图或插入插入时刻执行所需操作。