public: std::vector<std::vector<Node*>> paths;,void MainWindow::moveAgvs() { Astar astar; std::vector<std::vector<Node*>> paths(agvs.size()); //根據agv獲取taskid,初始化 int completed_task_index = -1; // 如果任務都完成了,停止定時器 bool all_tasks_completed = true; for (int j = 0; j < tasks.size(); j++) { if (tasks[j].completed != 2) { all_tasks_completed = false; break; } } if (all_tasks_completed) { timer->stop(); // 停止定时器 return; } // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getLoad() == true) { // 如果是负载的状态 if (agvs[i].getCurrentX() == agvs[i].getEndX() && agvs[i].getCurrentY() == agvs[i].getEndY()) { // 如果到达终点 agvs[i].setLoad(false); // 设置为空载状态 agvs[i].setState(true); std::cout << "agv__id :" << agvs[i].getid() << " ,agv_get_task_id :" << agvs[i].get_task_id() << endl; for (int j = 0; j < tasks.size(); j++) { if (tasks[j].id == agvs[i].get_task_id()) { completed_task_index = j; break; } } if (completed_task_index != -1) { tasks[completed_task_index].completed = 2; } task_to_agv(); // 更新任务分配 update(); // 更新AGV状态 } else { // 否则行驶到终点 Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path = astar.getPath(start_node, end_node1); path.erase(path.begin()); paths[i] = path; } } else { // 如果是空载的状态 if (agvs[i].getCurrentX() == agvs[i].getStartX() && agvs[i].getCurrentY() == agvs[i].getStartY()) { // 如果到达起点 agvs[i].setLoad(true); // 设置为负载状态 } else { // 否则行驶到起点 Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); std::vector<Node*> path = astar.getPath(start_node, end_node); path.erase(path.begin()); paths[i] = path; } } } // for (int i = 0; i < paths.size(); i++) { // std::cout << "AGV " << i << " path: "; // for (int j = 0; j < paths[i].size(); j++) { // std::cout << "(" << paths[i][j]->x << "," << paths[i][j]->y << ") "; // } // std::cout << std::endl; // },爲什麽在其他函數中引用path永遠為空,怎麽修改代碼,
时间: 2024-01-10 08:05:07 浏览: 29
在上面的代码中,paths 是 MainWindow 类的一个成员变量,它在 moveAgvs 函数中被初始化并赋值。如果在其他函数中想要使用 paths 变量,需要确保该变量已经被初始化并且赋值。在其他函数中,你可以通过以下两种方式访问 paths 变量:
1. 将 paths 变量声明为 MainWindow 类的公有成员变量,这样其他函数就可以直接访问该变量。
2. 在其他函数中创建一个 MainWindow 类的实例,然后使用该实例访问 paths 变量。例如:
```c++
void SomeOtherFunction()
{
MainWindow mainWindow;
std::vector<std::vector<Node*>> paths = mainWindow.paths;
// 现在可以使用 paths 变量了
}
```
需要注意的是,在第二种方法中,必须确保 MainWindow 类的实例已经被创建并且 moveAgvs 函数已经被调用过,否则 paths 变量可能还没有被初始化。
相关问题
void MainWindow::moveAgvs() { Astar astar; std::vector<std::vector<Node*>> paths(agvs.size());,怎麽在別的函數里引用moveagvs的局部變量path
在C++中,局部变量只能在其所在的函数内部使用,不能在其他函数中直接引用。如果想要在其他函数中使用局部变量,有以下两种方法:
1. 将局部变量声明为类的成员变量,这样其他函数就可以通过类的对象访问该变量。
例如,在MainWindow类中声明一个std::vector<std::vector<Node*>> paths成员变量,并在moveAgvs函数中将其赋值,然后就可以在其他函数中通过MainWindow对象访问该变量:
```
class MainWindow {
public:
void moveAgvs();
std::vector<std::vector<Node*>> paths;
};
void MainWindow::moveAgvs() {
Astar astar;
paths.resize(agvs.size());
// ...
}
void otherFunction(MainWindow& mainWindow) {
// 使用MainWindow对象的成员变量paths
// ...
}
```
2. 将局部变量作为参数传递给其他函数。
例如,在其他函数中声明一个std::vector<std::vector<Node*>>类型的参数,然后在调用该函数时将局部变量paths作为参数传递:
```
void otherFunction(std::vector<std::vector<Node*>>& paths) {
// 使用传递进来的paths变量
// ...
}
void MainWindow::moveAgvs() {
Astar astar;
std::vector<std::vector<Node*>> paths(agvs.size());
// ...
otherFunction(paths);
}
```
public: std::vector<std::vector<Node*>> paths;,void MainWindow::moveAgvs() { Astar astar; std::vector<std::vector<Node*>> paths(agvs.size()); //根據agv獲取taskid,初始化 int completed_task_index = -1; // 如果任務都完成了,停止定時器 bool all_tasks_completed = true; for (int j = 0; j < tasks.size(); j++) { if (tasks[j].completed != 2) { all_tasks_completed = false; break; } } if (all_tasks_completed) { timer->stop(); // 停止定时器 return; } // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getLoad() == true) { // 如果是负载的状态 if (agvs[i].getCurrentX() == agvs[i].getEndX() && agvs[i].getCurrentY() == agvs[i].getEndY()) { // 如果到达终点 agvs[i].setLoad(false); // 设置为空载状态 agvs[i].setState(true); std::cout << "agv__id :" << agvs[i].getid() << " ,agv_get_task_id :" << agvs[i].get_task_id() << endl; for (int j = 0; j < tasks.size(); j++) { if (tasks[j].id == agvs[i].get_task_id()) { completed_task_index = j; break; } } if (completed_task_index != -1) { tasks[completed_task_index].completed = 2; } task_to_agv(); // 更新任务分配 update(); // 更新AGV状态 } else { // 否则行驶到终点 Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path = astar.getPath(start_node, end_node1); path.erase(path.begin()); paths[i] = path; } } else { // 如果是空载的状态 if (agvs[i].getCurrentX() == agvs[i].getStartX() && agvs[i].getCurrentY() == agvs[i].getStartY()) { // 如果到达起点 agvs[i].setLoad(true); // 设置为负载状态 } else { // 否则行驶到起点 Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); std::vector<Node*> path = astar.getPath(start_node, end_node); path.erase(path.begin()); paths[i] = path; } } } // for (int i = 0; i < paths.size(); i++) { // std::cout << "AGV " << i << " path: "; // for (int j = 0; j < paths[i].size(); j++) { // std::cout << "(" << paths[i][j]->x << "," << paths[i][j]->y << ") "; // } // std::cout << std::endl; // },爲什麽在其他函數中引用path永遠為空,怎麽修改
在 `MainWindow::moveAgvs()` 函数中,你创建了一个名为 `paths` 的局部变量,它是一个 `std::vector<std::vector<Node*>>` 类型的二维向量。然后,在循环中,你为 `paths[i]` 赋值一个 `std::vector<Node*>` 类型的向量。这个 `paths` 变量只在 `MainWindow::moveAgvs()` 函数中定义和使用,因此在其他函数中引用 `path` 变量时,它始终为空。
要在其他函数中访问 `paths` 变量,你需要将它定义为 `MainWindow` 类的成员变量。在 `MainWindow` 类的头文件中添加以下代码:
```cpp
private:
std::vector<std::vector<Node*>> paths;
```
然后,在 `MainWindow::moveAgvs()` 函数中,删除 `std::vector<std::vector<Node*>> paths(agvs.size());` 这一行,因为你现在已经有了一个成员变量 `paths`,不需要再创建一个局部变量了。
最后,在其他函数中引用 `paths` 变量时,使用 `this->paths` 表示它是 `MainWindow` 类的成员变量,而不是局部变量。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)