gpt4 book ai didi

c++ - 为什么我不能拥有指向与成员变量具有相同类型指针的对象的指针?

转载 作者:太空宇宙 更新时间:2023-11-04 15:33:40 25 4
gpt4 key购买 nike

我的措辞方式听起来有点奇怪,但这只是因为我不知道该如何措辞。我正在尝试实现 A*,我之前也做过,但我在追溯我的路径时遇到了一个问题,所以我决定运行一个小测试。问题是这样的:

我有一个看起来有点像这样的类:

class Number {
public:
int xPos;
int yPos;

Number *prevNum;
Number(int x, int y) {
xPos = x;
yPos = y;
}
};

在主函数中,我这样做

int main() {
Number n(2, 2);
Number *current = &n;
vector<Number> nums;
nums.push_back(*current);
for (unsigned i = 0; i < 15; i++) {
Number n(current->xPos + 1, current->yPos);
n.prevNum = current;
nums.push_back(n);
current = &n;
cout << current->xPos + 1 << " ";
}
for (unsigned i = 0; i < nums.size(); i++) {
if (nums.at(i).prevNum) {
cout << nums.at(i).prevNum->xPos << " ";
}
}
return 0;
}

出于某种原因,它返回这个:

4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 555437610 2 17 17 17 17 17 17 17 17 17 17 17 17 17 17

555437610 每次都不一样,所以我假设我的指针可能有错误。成员函数*prevNum 可以不无限嵌套吗?我不太确定如何描述它。

最佳答案

你的问题是

current = &n;

此处您获取循环局部变量的地址。在迭代结束时,该变量被销毁,这意味着您有一个指向不再存在的对象的指针。取消引用该指针是未定义的行为。

如果你想保持定义的行为,那么你应该做的是在 vector 中存储一个指向对象的指针。该指针可能/将在调用 push_back 后失效,但由于您在此之前使用过它,所以它没问题。你应该没问题

current = &nums.back();

您还会遇到存储前一个指针的问题。如果您从 vector 中捕获元素,如果 vector 重新分配空间,那么您将留下一个悬空指针。我认为您需要某种 shared_ptr 设置才能使其正常工作。

关于c++ - 为什么我不能拥有指向与成员变量具有相同类型指针的对象的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41402407/

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