std::shared_ptr 不更新其计数
std::shared_ptr not updating its count
我正在尝试在另一个存储std::array<std::shared_ptr<Tile>, 34>
的class Board
内创建一个自定义class Tile
网络。我正在使用class Tile
中的std::shared_ptr<Tile>
对象来显示连接了哪些节点。但是,当我初始化 34 个Tile
对象中的每一个时,列表中包含的尚未初始化的对象不会从nullptr
更新到它们自己的引用。
#include <memory>
#include <array>
#include <cstddef>
struct Tile;
template <const std::size_t N> using TileLink = std::array<const std::shared_ptr<const Tile>, N>;
template <const std::size_t N> using TileArray = std::array<std::shared_ptr<const Tile>, N>;
struct Tile {
/* surrounding tiles */
const std::size_t ID;
const std::size_t num_adj;
const TileLink<6> adjacent;
Tile (std::size_t id, std::size_t n, const TileLink<6> & arr) : ID (id), num_adj (n), adjacent (arr) { }
~Tile (void) = default;
};
class Board {
private:
TileArray<34> tiles;
public:
Board (void);
~Board (void) = default;
};
Board :: Board (void) {
/* Column 1 */
tiles[0] = std::make_shared<Tile> ( 0, 3, TileLink<6>{ tiles[1], tiles[4], tiles[5], nullptr, nullptr, nullptr });
tiles[1] = std::make_shared<Tile> ( 1, 4, TileLink<6>{ tiles[0], tiles[2], tiles[5], tiles[6], nullptr, nullptr });
tiles[2] = std::make_shared<Tile> ( 2, 3, TileLink<6>{ tiles[1], tiles[6], tiles[7], nullptr, nullptr, nullptr });
/* Column 2 */
tiles[3] = std::make_shared<Tile> ( 3, 2, TileLink<6>{ tiles[4], tiles[9], nullptr, nullptr, nullptr, nullptr });
tiles[4] = std::make_shared<Tile> ( 4, 5, TileLink<6>{ tiles[0], tiles[3], tiles[5], tiles[9], tiles[10], nullptr });
tiles[5] = std::make_shared<Tile> ( 5, 6, TileLink<6>{ tiles[0], tiles[1], tiles[4], tiles[6], tiles[10], tiles[11] });
tiles[6] = std::make_shared<Tile> ( 6, 6, TileLink<6>{ tiles[1], tiles[2], tiles[5], tiles[7], tiles[11], tiles[12] });
tiles[7] = std::make_shared<Tile> ( 7, 5, TileLink<6>{ tiles[2], tiles[6], tiles[8], tiles[12], tiles[13], nullptr });
tiles[8] = std::make_shared<Tile> ( 8, 2, TileLink<6>{ tiles[7], tiles[13], nullptr, nullptr, nullptr, nullptr });
/* Columns 4 - 6 */
...
...
...
/* Column 7 */
tiles[31] = std::make_shared<Tile> (31, 3, TileLink<6>{ tiles[26], tiles[27], tiles[32], nullptr, nullptr, nullptr });
tiles[32] = std::make_shared<Tile> (32, 4, TileLink<6>{ tiles[27], tiles[28], tiles[31], tiles[33], nullptr, nullptr });
tiles[33] = std::make_shared<Tile> (33, 3, TileLink<6>{ tiles[28], tiles[29], tiles[32], nullptr, nullptr, nullptr });
}
我传递给Tile
构造函数的std::array
不会更改。我该如何改变它?
任何帮助将不胜感激。很抱歉把这个问题问了这么久,我真的不知道如何把它变成一个小例子。
在这里:
tiles[0] = std::make_shared<Tile> ( 0, 3, TileLink<6>{ tiles[1], tiles[4], tiles[5], nullptr, nullptr, nullptr });
tiles[1]
、tiles[4]
等尚未初始化,shared_ptr
为 nullptr。稍后初始化tiles[1]
时,它不会更改tiles[0]
内部的内容。
你完全滥用shared_ptr
.由于磁贴数组具有固定大小,因此只需分配一次所有需要的内存,然后使用非拥有指针。因为内存有一个所有者,它是Board
.
我已经解决了我的问题 - 感谢 @t.niese 和 @fjardon 的帮助。
我不得不使Tile
变得更加复杂,以促进这里真正的问题:我无法从类中的 std::array 创建一个唯一的Tile
对象。所以我添加了一个复制构造函数和一个赋值运算符,删除了智能指针和const
-ness,并使类类型的数组Tile
。
class Tile;
template <const std::size_t N> using TileLink = std::array<const Tile *, N>;
template <const std::size_t N> using TileArray = std::array<Tile, N>;
enum class OWNERSHIP { PLAYER_1, PLAYER_2, CONTESTED };
class Tile {
private:
OWNERSHIP territory;
/* surrounding tiles */
std::size_t ID;
std::size_t num_adj;
TileLink<6> adjacent = { nullptr };
public:
Tile (void) { }
Tile (OWNERSHIP own, std::size_t id, std::size_t num, const TileLink<6> & arr);
Tile (const Tile & rhs);
Tile & operator = (Tile other);
~Tile (void) = default;
};
class Board {
private:
TileArray<34> tiles;
void create_col_1_and_7 (void);
void create_col_2 (void);
...
void create_col_6 (void);
public:
Board (void);
~Board (void) = default;
};
每个初始化现在如下所示:
tiles[0] = Tile (OWNERSHIP::PLAYER_2, 0, 3, TileLink<6>{ &tiles[1], &tiles[4], &tiles[5], nullptr, nullptr, nullptr });
tiles[1] = Tile (OWNERSHIP::CONTESTED, 1, 4, TileLink<6>{ &tiles[0], &tiles[2], &tiles[5], &tiles[6], nullptr, nullptr });
...
tiles[32] = Tile (OWNERSHIP::CONTESTED, 32, 4, TileLink<6>{ &tiles[27], &tiles[28], &tiles[31], &tiles[33], nullptr, nullptr });
tiles[33] = Tile (OWNERSHIP::PLAYER_1, 33, 3, TileLink<6>{ &tiles[28], &tiles[29], &tiles[32], nullptr, nullptr, nullptr });
相关文章:
- 从C++本机插件更新Vector3数组
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- cmake更新缓存的变量
- 更新到莫哈韦后出现cmath错误
- CLANG 编译器 说:变量"PTR"可能未初始化
- OpenMP:并行更新数组总是需要减少数组吗
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 指针没有更新它在void函数内部指向的值
- 如何在c++中获取要更新的值
- 已修改的LinkedList未在文本文件本身中更新
- Qt:当QListView获得新条目时,如何更新QStringList
- 更新的矢量元素不打印
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 如何在ECS框架中更新组件数据和通知系统
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- 如果我想在没有更新编译器的情况下使用新功能,该怎么办?
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新