访问unique_ptr的多维向量中持有的对象的方法
Accessing methods of objects held in multidimensional vectors of unique_ptr's
我有一个对象的二维结构,初始化如下:
std::vector<std::shared_ptr<tile> > appearance;
for (int x = 0; x < building_data.x_width; x++)
{
appearance.push_back
(std::shared_ptr<tile>(new tile[building_data.y_length]));
}
现在,据我所知,访问tile的成员函数的唯一方法是使用
appearance.at(x).get()[y].member_function()
这是令人困惑和繁琐的,我觉得我错过了一些东西。
之前,我对相同的结构使用了tile**
,并使用了的语法tile[x][y]
很好,但是原始指针令人头疼。
那么,是否有更好的方法访问数组中保存的对象的函数,其中数组中的第一个元素是由vector中保存的智能指针指向的?虽然冗长,但这是我最好的了
可以使用->操作符访问由shared_ptr管理的对象的成员。与原始指针的语法相同。
然而,正如Dantez的回答所提到的,你将会遇到delete的问题。
而且,看起来你是在制作某种棋盘的瓷砖,也许是为了游戏?您是否考虑过用1D向量和一些访问器函数替换多维数组?
// board_width and height should be integers
std::vector<Tile> board;
board.reserve(board_width * board_height);
for (unsigned y_axis = 0; y_axis < board_height; ++y_axis)
{
for (unsigned x_axis = 0; x_axis < board_width; ++x_axis)
{
board.push_back(Tile());
}
}
…
vec2 index_to_coords(unsigned index)
{
return vec2(index % board_width, index / board_width);
}
…
unsigned coords_to_index(const vec2& coords)
{
return (static_cast<unsigned>(coords.y) * board_width) + static_cast<unsigned>(coords.x);
}
首先,shared_ptr
不是为数组设计的。当没有更多的引用时,它调用delete
而不是delete[]
,如果托管对象是一个数组,则会导致未定义的行为。你可以在这里读到。
对于访问shared_ptr
对象,可以使用操作符*对其解引用。
同样,如果您知道vector的最终大小,您可能需要保留一些空间以避免重新分配。
我同意fibles的观点,但是我有另一个想法要提供。Fibble的方法实际上甚至在C语言中也很常见,因为多维结构(矩阵)用这种方法要简单得多。
然而,如果你坚持二维概念,你可以嵌套向量。考虑:
typedef std::vector< tile > TileRow;
typedef std::vector< TileRow > Tiles;
一开始,这可能有点令人困惑,所以要清楚,这创建了:
std::vector< std::vector< tile > > t;
但是,对于typedef,那是
Tiles t;
这是空的。要使用它,您需要推入一些行,并为每一行推入一些列。你可能不喜欢,所以…您可以使用assign函数来设置一些行。例如,如果您需要一个10行× 10列的矩阵,您可以
t.assign( 10, TileRow( 10, tile() ) );
这个假设tile有一个默认构造函数,推入10行TileRow,每一行有10列默认构造的tile。
现在,t[ 1 ]
返回对行1的引用。因此,t[ 1 ][ 1 ]
是对位置1,1的tile的引用,很像一个数组。
然而,现在你没有分配/释放问题。
std::array也可以做类似的事情,甚至更好。
typedef std::array< tile, 10 > TileRow;
typedef std::array< TileRow, 10 > Tiles;
Tiles t;
此时,t已经准备好了默认初始化的tile。
- 使用std::函数映射对象方法
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 从父类方法返回子类对象
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 为什么此派生对象无法访问基类的后递减方法?
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 正在调用shared_ptr对象方法
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 检查哪个对象调用了另一个对象的对象方法
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 没有取消引用/解包对象的标准方法?
- 使用 gmock c++ 在真实对象上调用方法
- 当我调用对象的方法时,对象的成员会发生变化
- 根据对象类调用不同的方法
- 如何在C++中循环访问未知对象方法?
- 使用动态实例化的对象填充矢量的快速方法
- 对类中的对象使用方法