如何将对共享指针的引用分配给另一个共享指针
How to assign a reference to a shared pointer to another shared pointer
我正在重构一些使用原始指针的代码,改为使用共享指针。
在原始代码中,有一个指向列表对象的原始指针,我们称它为 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());
}
None 以上方法都有效。我也尝试过其他各种方法,但它们都相当于在不知道我在做什么的情况下在黑暗中刺伤。欢迎任何关于我应该做什么的想法和解释为什么。
正如您在代码中的其他地方将 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...
}
使用 &
运算符获取 T
类型变量的地址会生成 T*
1 类型的指针。在这种情况下,T
是 EntityList_ptr
.
1:前提是 T
不会覆盖 operator&
,而 std::shared_ptr
不会。
因此,由于 typeXXXList
是 EntityList_ptr
变量,使用 &
运算符获取它们的地址会产生 EntityList_ptr*
指针。
我正在重构一些使用原始指针的代码,改为使用共享指针。 在原始代码中,有一个指向列表对象的原始指针,我们称它为 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());
}
None 以上方法都有效。我也尝试过其他各种方法,但它们都相当于在不知道我在做什么的情况下在黑暗中刺伤。欢迎任何关于我应该做什么的想法和解释为什么。
正如您在代码中的其他地方将 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...
}
使用 &
运算符获取 T
类型变量的地址会生成 T*
1 类型的指针。在这种情况下,T
是 EntityList_ptr
.
1:前提是 T
不会覆盖 operator&
,而 std::shared_ptr
不会。
因此,由于 typeXXXList
是 EntityList_ptr
变量,使用 &
运算符获取它们的地址会产生 EntityList_ptr*
指针。