我有一个“编辑”类和一个“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。
我知道我可能会使用指针或参考,但我不能成功......
答案 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 */
}
您正在通过值传递,从而制作参数的副本,然后修改副本而不是参数。这是问题吗?