C ++如何从类中的另一个类修改地图

时间:2013-12-30 17:35:38

标签: c++ class map

我有一个“编辑”类和一个“TileMap”类。

我希望能够使用我的编辑类修改我的Tilemap类,更具体地说是Tilemap类中的std :: map。

更明显我不想这样做:

class Editor
{
private:
    std::map <int, tilemap> m_tilemap; // <--- i want this map

public:
    void target(std::map <int, tilemap> tilemap) // <---- to target this map
    {
        /*  ?   */
    }

    void putABlock(sf::Vector3i coord) // <---- and modify it through several methods...
    {
       /* modify the map */
    }

};

“tilemap”,(减去't')是一个结构,带有int,bool和sf :: sprite。

我知道我可能会使用指针或参考,但我不能成功......

2 个答案:

答案 0 :(得分:1)

这里是您想要的代码:

class Editor
{
private:
    // Use a pointer to the map
    std::map<int, tilemap>* m_tilemap;

public:
    Editor()
    {
      // Set it to nullptr to avoid error in putABlock if it is called prior to
      // initialization
      m_tilemap = nullptr;
    }

    // Use reference to ensure that there is a tilemap passed. If it is optional
    // us a pointer void target(std::map<int, tilemap>* tilemap)
    void target(std::map<int, tilemap>& tilemap) 
    {
        // Assign the address of the tilemap to the pointer
        m_tilemap = &tilemap;
    }

    void putABlock(sf::Vector3i coord)
    {
        // Ensure here that we're working on something initialize.        
        if (nullptr == m_tilemap)
        {
            // Report error via one of the following method
            // 
            // * assert
            // * exeption
            // * log message

            return;
        }

       /* modify the map*/
       // Here some usage example:
       m_tilemap->insert(std::make_pair(...));
       (*m_tilemap)[...] = ...;
       (*m_tilemap)[...].tilemap_member = ...;
    }

};

但是我认为你应该重新修改你的类,以便Editor调用Tilemap中的方法,而不是对其他结构所持有的东西起作用。

如果Tilemap oulive Editor,我宁愿使用类似的内容:

class Editor
{
private:
    // Use a reference to the map: the tilemap outlive the editor
    Tilemap& m_tilemap;

public:
    Editor(Tilemap& tilemap) :
        m_tilemap(tilemap) // Initialize with the Tilemap already created
    {      
    }



    void putABlock(sf::Vector3i coord)
    {
        // No more test needed here

       /* modify the map */
       m_tilemap.methodOnTilemap(....);
    }

};

如果Tilemap的生命与我所做的编辑器相同:

class Editor
{
private:
    // Use a instance of Tilemap 
    Tilemap m_tilemap;

public:
    Editor(/* take potential params to create the tilemap */ ) :
        m_tilemap(/* feed the tilemap with the params*/ ) 
    {      
    }

    void putABlock(sf::Vector3i coord)
    {
        // No more test needed here

       /* modify the map */
       m_tilemap.methodOnTilemap(....);
    }

};

如果每个对象的相对活跃度非常复杂,您应该查看std::shared_ptr<>

如果您认为您确实需要直接修改std::map<...>,那么关于生动性和参考/指针/ shared_ptr的建议仍然存在。

答案 1 :(得分:0)

如果您希望在任何一种情况下都修改输入参数,则必须通过引用传递。

void target(std::map <int, tilemap>& tilemap) // <---- to target this map
{
    ?
}

void putABlock(sf::Vector3i& coord) // <---- and modify it through several methods...
{
   /* modify the map */
}

您正在通过值传递,从而制作参数的副本,然后修改副本而不是参数。这是问题吗?