gpt4 book ai didi

c++ - 在 C++ 中嵌套传递对指针的引用

转载 作者:行者123 更新时间:2023-11-28 02:13:19 26 4
gpt4 key购买 nike

我有一个应用程序,其中包含类 Obj 的实例,每个实例都由 ID 整数标识为类成员。这些对象被安排为顶级对象,嵌套子对象的分支存储在 std::vector 中,如下所示:

/* Obj tree with L ID as:
*
* Obj (L 0)
* |
* Obj (L 1)
* |
* Obj (L 2)
*
*/

我已经定义了一个实用方法来将指针重定向到层次结构中具有给定 ID 的对象。这被实现为从每个具有子对象的对象递归调用实用程序,直到找到对象或到达层次结构的底部。然后递归应该展开并返回指向应用程序范围的指针。出于这个原因,我已将指针作为引用传递,以便它可以在适当的递归调用中更改。

源码如下:

对象类是

// Object class
class Obj {

friend class Utils;
friend class App;

public : Obj(int ID_L) // Overloaded constructor
{
this->ID_L = ID_L;
}

// Public and private IDs
public : int ID_L;

// Vector of sub objects
std::vector<Obj> subObj;

// Add sub-obj method
public : void addSubObj(int num_layers) {

// Add the sub-obj
subObj.emplace_back( this->ID_L + 1);

// Add one underneath if necessary
if (subObj.back().ID_L <= num_layers) {
subObj.back().addSubObj(num_layers - 1);
}

};

};

实用类是

// Utility class
class Utils {

// Static method to return pointer to obj in the hierarchy
public : static void getObj(Obj*& ObjTree, int ID_L, Obj*& ObjRet) {

// Try match on the top of the tree given
if (ObjTree->ID_L == ID_L) {
ObjRet = ObjTree; // Match found so update pointer and return
return;

} else {

// Loop through array of subObjs on this Obj
for (Obj o : ObjTree->subObj) {

// Create pointer to object in present scope
Obj* O = &o;

// Look for match on this subObj
Utils::getObj(O, ID_L, ObjRet); // Recursvie call passing reference of pointer along and address of present sub-Obj and its children

// If a match found then return the non-null pointer
if (ObjRet != NULL) {
return;
}

}

}

// Specified Obj has not been found in the tree
return;

}

};

应用类是

// Application class
class App {

public : void run () {

// Create object tree as above
Obj TopObj(0); // Top level obj
TopObj.addSubObj(2); // Left side branch

// Create pointer to Obj to do further stuff with
Obj* _o;

// Create pointer to tree
Obj* Tree = &TopObj;

// Loop over all desired ID combos and return pointer to appropriate Obj in hierarchy
for (int l = 0; l <= 2; l++) {

// Null the pointer in preparation for next Obj
_o = NULL;

// Try to fetch a particular Obj from ObjTree
Utils::getObj(Tree, l, _o);

// If pointer is not null then Obj has been found so try to read IDs from it
if (_o != NULL) {
std::cout << "FOUND -- L" << l << " : reading ID from pointer as L" << _o->ID_L << " : " << _o << std::endl;
}

}

}

};

入口点在这里:

// Entry point
int main(int argc, char* argv[]) {

// Start application
App a;
a.run();
}

在调试时,我已经将指针 _o 的值写到屏幕上,当找到对象时我可以看到它发生变化,然后在递归展开时保持它的值。但是,当尝试访问它指向的对象以在应用程序范围内将 ID 打印到屏幕时,数字是垃圾。 当对象在层次结构的 2 层深处或更多层中被发现时就是这种情况。当仅向下钻取一个级别时,它确实有效。

由于我将指针作为引用传递,所以我确信它们将在范围内传递,但情况似乎并非如此,因为对象似乎超出了范围。

任何人都可以看到此实现的问题并可能建议改进这样一个对象检索实用程序的实现吗?

最佳答案

for (Obj o : ObjTree->subObj) {
Utils::getObj(&o, ID_L, ID_R, ObjRet);

您复制了 Obj 并且 ObjRet 离开范围后可能会有悬空指针。

改用:

for (Obj& o : ObjTree->subObj) {
Utils::getObj(&o, ID_L, ID_R, ObjRet);

关于c++ - 在 C++ 中嵌套传递对指针的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34921312/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com