我是一个完整的 C++ 初学者,直到现在一切都进行得很顺利。我对指针的想法很陌生(我来自 python),我有这个奇怪的错误。
所以基本上,我创建了这个“SearchNode”类,并在下面找到它的方法之一“getChildren”,它应该返回其他 SearchNode 实例的向量,表示骑士(棋盘)可以从当前状态移动到的可能单元格。(BFS)
也就是说,当我完成推入向量时,所有元素突然只指向第一个元素。有人可以帮我吗?
PS:这是一个与 c++ 类似的问题push_back 不能按预期工作......但与 Angela(正在编写自己的编译器)不同,我是 c++ 的初学者。非常感谢您的帮助。
更新
我摆脱了 int*,并为我的状态使用了数组。我现在可以成功搜索图表(因此状态正常)并找到最短路径,但我似乎无法重建路径。
为了测试,我从{0,0}开始,可以找到{4,4},但是路径,根据getPath方法是{4,4}, {3,6}, {3,6}, {3 ,6} ...({3,6} 的无限循环)。我的父指针或 getPath 函数有问题吗?提前感谢您的支持。
//Search class
class SearchNode
{
public:
//Variables
SearchNode *m_parent;
array<int,2> m_state; //I don't understand typedef's yet, will use them when I'm clearer with them :)
//Normal Constructor
SearchNode(array<int,2>& state_, SearchNode *parent_=nullptr) :
m_state(state_),
m_parent(parent_)
{}
//Method to get Next reachable states. Returns instances of SearchNode.
vector<SearchNode> getChildren()
{
int legalMoves[8][2] = {{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};
vector<SearchNode> children;
children.reserve(8);
for(int i=0; i<8; i++)
{
int x = (m_state[0] + legalMoves[i][0]);
int y = (m_state[1] + legalMoves[i][1]);
if( (x>-1) and (x<9) and (y<9) and (y>-1)) // Within the bounds of the board
{
array<int,2> childState = {x,y};
SearchNode childNode = SearchNode(childState,this);
children.push_back(childNode);
}
}
return children;
}
void getPath()
{
cout<<"\nPath: ";
cout<< this->print();
SearchNode current = *this;
unsigned int counter = 1;
while((current.m_parent!=nullptr) and counter< 10)
{
counter++;
cout<< (current.m_parent)->print();
current = *(current.m_parent);
}
cout << (current.m_parent)->print();
}
string print()
{
stringstream out;
out << "{" << this->m_state[0] << "," << this->m_state[1] << "} ";
return out.str();
}
};