在c++中,current_a = new a(1);current_a = new a(2);此时如何访问第一个对象?
时间: 2024-01-21 20:16:46 浏览: 22
这个情况下,如果你没有保存第一个对象的指针,那么就无法直接访问第一个对象了。因为第一个对象的指针已经被 current_a 指向了新的对象。这就是所谓的内存泄漏,因为第一个对象的内存没有被释放,但是又无法访问到它了。
为了避免这种情况,你可以在创建第二个对象之前先保存第一个对象的指针,例如:
```
a* first_a = new a(1);
current_a = new a(2);
// 现在可以通过 first_a 访问第一个对象了
```
或者你也可以使用一个数组或者链表来保存多个对象的指针,这样就可以避免出现内存泄漏的问题。
相关问题
在c++中,用current_a 先后new了两个对象后,如何访问new的第一个对象?
可以使用指针来访问new的第一个对象,具体做法是将第一个对象的地址存储在一个指针变量中。示例代码如下:
```
// 创建第一个对象
MyClass* obj1 = new MyClass;
// 创建第二个对象
MyClass* obj2 = new MyClass;
// 访问第一个对象
obj1->doSomething();
```
在上述代码中,我们通过new关键字创建了两个MyClass对象,分别存储在obj1和obj2指针变量中。要访问第一个对象,我们直接使用obj1指针即可,例如调用它的doSomething()方法。
void MainWindow::moveAgvs_(){ timer =new QTimer(this); timer->start(1000); connect(timer, &QTimer::timeout, this, &MainWindow::moveAgvs);} void MainWindow::moveAgvs() { Astar astar; std::vector<Node*> path; std::vector<std::vector<Node*>> paths(agvs.size()); // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node; if (agvs[i].getLoad() == false) { end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); } else { end_node = new Node(agvs[i].getEndX(), agvs[i].getEndY()); } std::vector<Node*> path = astar.getPath(start_node, end_node); paths[i] = path; //輸出agv的路綫 std::cout << "AGV " << i << " path: "; for (int j = 0; j < path.size(); j++) { std::cout << "(" << path[j]->x << ", " <<path[j]->y << ")"; if (j != path.size() - 1) { std::cout << " -> "; } } std::cout << std::endl; } for (int i = 0; i < agvs.size(); i++) { if (! paths[i].empty()) { Node* next_node = paths[i][0]; float speed = agvs[i].getSpeed(); float distance = sqrt(pow(next_node->x - agvs[i].getCurrentX(), 2) + pow(next_node->y - agvs[i].getCurrentY(), 2)); float time = distance / speed * 1000; QTimer::singleShot(time, this, &, i, next_node { agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); std::cout << "AGV " << agvs[i].getid() << " current_x: " << agvs[i].getCurrentX() << " current_y: " << agvs[i].getCurrentY() <<std::endl; this->update(); if (next_node->x == agvs[i].getEndX() && next_node->y == agvs[i].getEndY()) { //task_to_agv(i); } }); } } },agv沒有模擬運行,修改一下
有几个问题需要修正:
1. `moveAgvs_()`函数中,应该将`timer->start(1000)`放在`connect`语句的后面,因为如果`timeout`信号在`start()`之前被触发,会导致`moveAgvs()`函数在启动定时器之前就被调用。
2. 在`moveAgvs()`函数中,定义了一个名为`path`的局部变量,覆盖了函数开头定义的`std::vector<Node*> path`。因此,在后面对`paths`进行赋值时,实际上是没有生效的。应该将第6行的`std::vector<Node*> path;`修改为`path = astar.getPath(start_node, end_node);`。
3. 在`QTimer::singleShot()`函数的第三个参数中,应该将`&`去掉,并在lambda表达式中加入`i`和`next_node`的捕获列表。即将`&, i, next_node`修改为`[=, i, next_node]() mutable {`。
4. 在`QTimer::singleShot()`函数中,应该将花括号中的代码块用圆括号括起来,即将`{ agvs[i].setCurrentX(next_node->x);`修改为`{ agvs[i].setCurrentX(next_node->x); }`。
下面是修改后的代码:
```c++
void MainWindow::moveAgvs_()
{
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MainWindow::moveAgvs);
timer->start(1000);
}
void MainWindow::moveAgvs()
{
Astar astar;
std::vector<std::vector<Node*>> paths(agvs.size());
// 得到agv的路线
for (int i = 0; i < agvs.size(); i++)
{
Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY());
Node* end_node;
if (agvs[i].getLoad() == false)
{
end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY());
}
else
{
end_node = new Node(agvs[i].getEndX(), agvs[i].getEndY());
}
std::vector<Node*> path = astar.getPath(start_node, end_node);
paths[i] = path;
// 输出agv的路线
std::cout << "AGV " << i << " path: ";
for (int j = 0; j < path.size(); j++)
{
std::cout << "(" << path[j]->x << ", " << path[j]->y << ")";
if (j != path.size() - 1)
{
std::cout << " -> ";
}
}
std::cout << std::endl;
}
for (int i = 0; i < agvs.size(); i++)
{
if (!paths[i].empty())
{
Node* next_node = paths[i][0];
float speed = agvs[i].getSpeed();
float distance = sqrt(pow(next_node->x - agvs[i].getCurrentX(), 2) + pow(next_node->y - agvs[i].getCurrentY(), 2));
float time = distance / speed * 1000;
QTimer::singleShot(time, [=, i, next_node]() mutable {
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
std::cout << "AGV " << agvs[i].getid() << " current_x: " << agvs[i].getCurrentX() << " current_y: " << agvs[i].getCurrentY() << std::endl;
this->update();
if (next_node->x == agvs[i].getEndX() && next_node->y == agvs[i].getEndY())
{
//task_to_agv(i);
}
});
}
}
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.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)
![](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)
![](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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)