【问题标题】:How to assign a reference to a shared pointer to another shared pointer如何将共享指针的引用分配给另一个共享指针
【发布时间】:2021-11-07 02:13:30
【问题描述】:

我正在重构一些使用原始指针来使用共享指针的代码。 在原始代码中,有一个指向列表对象的原始指针,我们称之为 EntityList 我在 EntityList.h 文件中定义了一个指向 EntityList 的共享指针,如下所示:

using EntityList_ptr = std::shared_ptr<EntityList>;

在要重构的代码中,有一个地方可以将列表设置为几种列表中的一种。

这里是创建列表的地方:

EntityList_ptr typeZeroList = EntityList_ptr (new ZeroList);
EntityList_ptr typeOneList = EntityList_ptr (new OneList);
EntityList_ptr typeTwoList = EntityList_ptr (new TwoList);
EntityList_ptr typeThreeList = EntityList_ptr (new ThreeList);

这里是我将列表设置为适当类型的地方:

setList (int type) {
    EntityList** list;

if (type == 0) {
    list = &typeZeroList;
} else if (type ==1) {
    list = &typeOneList;
} else if (type ==2) {
    list = &typeTwoList;
} else {
    list = &typeThreeList;
}

我不知道如何重构它。这是我的尝试(我在下面的 if-else 部分尝试了三种不同的方法。:

setList (int type) {
    std::shared_ptr<EntityList_ptr> list;

    if (type == 0) {
        list = &typeZeroList;
    } else if (type ==1) {
        list = typeOneList.get();
    } else if (type ==2) {
        list = &(typeTwoList.get());
    } else {
        list = std::shared_ptr<Entity> (typeThreeList.get());
    }

以上方法均无效。我也尝试过其他各种方法,但它们都相当于在黑暗中刺伤而不知道我在做什么。欢迎任何关于我应该做什么的想法和解释原因。

【问题讨论】:

  • 这听起来像是一个设计问题。为什么你想要shared_ptr 到shared_ptr?为什么 shared_ptr 需要自己的所有者? list 应该拥有原始 shared_ptr 的副本还是您已经拥有的相同 shared_ptr 的副本?
  • 情况不清楚,因为我们看不到list在整个代码中的作用。也许您可以在问题的文本中总结该角色? list 有可能被转换为智能指针。在某些代码中仍然有原始的、非拥有的指针的用途。也许这是其中之一?或者也许需要其他一些替代?您是否考虑过 EntityList_ptr * list 或 -- 因为看起来 null 不是一个选项 -- EntityList_ptr &amp; list
  • 感谢您查看它,即使我的帖子不清楚。我刚刚花了大约一个小时编写了一个示例程序以使其更清晰,但是 Remy 在下面发布了答案,然后我才能编辑上面的内容。

标签: c++ shared-ptr


【解决方案1】:

正如您在代码中的其他地方将 EntityList* 替换为 EntityList_ptr 一样,您可以在此处执行完全相同的操作。 EntityList** 会简单地变成EntityList_ptr*,例如:

setList (int type) {
    EntityList_ptr* list;

    if (type == 0) {
        list = &typeZeroList;
    } else if (type ==1) {
        list = &typeOneList;
    } else if (type ==2) {
        list = &typeTwoList;
    } else {
        list = &typeThreeList;
    }

    // use *list as needed...
}

使用&amp; 运算符获取T 类型变量的地址会生成T* 类型的指针1。在这种情况下,TEntityList_ptr

1:前提是T 不会覆盖operator&amp;,而std::shared_ptr 不会。

因此,由于typeXXXListEntityList_ptr 变量,因此使用&amp; 运算符获取它们的地址会产生EntityList_ptr* 指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2017-05-14
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    相关资源
    最近更新 更多