如何将对共享指针的引用分配给另一个共享指针



我正在重构一些使用原始指针的代码,而不是使用共享指针。在原始代码中,有一个指向列表对象的原始指针,我们称之为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());
}

上述方法都不起作用。我也试过其他各种方法,但它们都相当于在不知道我在做什么的情况下在黑暗中捅刀子。任何关于我应该做什么的想法和解释都是受欢迎的。

正如您在代码的其他地方用EntityList_ptr替换EntityList*一样,您可以在这里做完全相同的事情。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不覆盖

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

最新更新