不确定这是否是唯一的问题,但在这里
我正在实现一种树搜索,该树搜索需要能够从树中获取“最有希望的节点”,然后对该节点执行某些操作,以便为下一次迭代更新树的其余部分。
问题:对象指针Board*
的向量属性似乎在生成它们的函数的return
和在调用环境中将其保存的Board*
值之间改变。
我的输出:
>>g++ -std=c++17 -o tmp.out tests/test.cpp // <- require c++17 for other parts of the project >>./tmp.out Best leaf by tree traversal has score: 8 Best leaf associated state has -1977735524 values in its attribute vector though! (Should be 4)
我期望的是:
>>g++ -std=c++17 -o tmp.out tests/test.cpp // <- require c++17 for other parts of the project >>./tmp.out Best leaf by tree traversal has score: 8 Best leaf associated state has 4 values in its attribute vector though! (Should be 4)
#include <iostream> #include <vector> #include <queue> using namespace std; class Board{ vector<int> attribute; string name; public: Board(){ attribute = {1,2,3,4}; name = "nonempty name"; } Board getcopy(){ return *this; } int AttrLen(){ return attribute.size(); } }; class Node{ Board* board; Node* parent; std::vector<Node*> children; int depth=0; int score=0; bool terminal=false; public: Node(Node* _parent, Board* _board,int _depth){ parent = _parent; board = _board; depth = _depth; // randomize score score = rand() % 10; if(depth<2){ for(int _=0;_<2;_++){ Board new_state = board -> getcopy(); children.push_back(new Node(this,&new_state,depth+1)); } } else { children = {}; terminal=true; } } int getScore(){ return score; } bool isTerminal(){ return terminal; } Node* getBestChild(){ if(!terminal){ if(children[0] ->getScore() > children[1] -> getScore()){ return children[0]; } else { return children[1]; } } else { return nullptr; } } Board* getStateptr(){ return board; } }; int main(){ // make a board Board my_board = Board(); // make a root node Node root = Node(nullptr, &my_board, 0); Node* best_child = root.getBestChild(); while(!best_child -> isTerminal()){ best_child = best_child -> getBestChild(); } cout << "Best leaf by tree traversal has score: " << best_child -> getScore() << endl; cout << "Best leaf associated state has " << best_child -> getStateptr() ->AttrLen() << " values in its attribute vector though! (Should be 4)" << endl; }
我正在实现一种树搜索,该树搜索需要能够从树中获取“最有希望的节点”,然后对该节点执行某些操作,以便为...更新树的其余部分...]]] >
不确定这是否是唯一的问题,但在这里
for(int _=0;_<2;_++){ Board new_state = board -> getcopy(); children.push_back(new Node(this,&new_state,depth+1)); }
您创建的
Board
副本仅存在于for
循环中。它会在}
自动销毁。因此,您存储在节点中的指针是悬空的。指向已久的对象。
请注意,您的getcopy
有点奇怪。您应该改为使用复制构造函数。通常,当您的类型通过原始指针管理资源时(不确定是否确实如此),则需要遵守3/5规则。在任何情况下,您都可以通过编写Board new_state = *board;
来简单地复制电路板(假设编译器生成的复制构造函数执行正确的操作)。
不确定这是否是唯一的问题,但在这里