1) I don't think Tiles should "own" the objects, since the objects are continuously changing Tiles. You could keep the Map_Objects in the Map, and let Map handle their deletion (deleting a tile wouldn't delete the objects, nor need to).
2) Do you really need to give out Tile copies? Pathfinding should be able to make do with const tile refferences or pointers (pointers probably would be better). If some class needs access to what is in a tile, you could give them an iterator to a const container. The class would be able to view and call non const methods on the contents of the tile, but be unable to change the tile itself, which I suspect is what you almost always want (you should only need to change the contents of a tile when the contents move or are destroyed. Both cases can be done as special functions in tiles (destroy (Map_Object o) would just remove it, while move(Map_Object o, Tile t) would remove it from the current tile and add it to t).
You approach of keping map_objets in map instead of tiles sounds a lot less complicated. However, the idea of having the map_objects inside the tile was because map_objects can change tile properties, and having the map_object inside tile, would allow map_objects to modify tile without altering it's contents. Say you have a function
bool Tile::blocks_LoS()
With a map_object inside tile, I could
if (map_object->blocks_LoS() == true) return true;
else return m_block_loS; <----This line refers to the Tile m_block_LoS member variable
or more importantly, in the case of a function that return AP travel costs
return m_travel_cost + map_object->r_added_travel_cost();
With map_objects outside of tiles, when I sent my tiles to the pathfinding function (which can make do with references only, like you mentioned), they won't take into account added travel costs or impassability generated by map_objects (unless I alter the pathfinding function to deal exclusively with map, which while doable, might generate some headache)
Let's talk keeping map_objects inside map. I see two approaches, keeping a map_object for each tile position ( a null map_object when you don't have an actual object ), or keeping a list of actual, non-null, map objects with their positions, and just search that list to see if there's a map_object in the same position as the tile that's being accessed when I need to know something about a tile. Like:
bool Map::r_blocks_LoS(int x, int y)
{
check_if_object_exists_at(x, y); <-----This function would iterate over a list or something
deal with LoS of the tile and object, if it exists
return result
}
The first approach seems faster, because you wouldn't need to iterate over a list. But the second one wouldn't need to have scores of null objects stored, which I don't like, seems dumb to me
.