主要问题是创建动态类。我做了什么:
ptr = new animal[2];
我正在尝试创建一个大小为2的动态数组,由指针ptr指向。 当我尝试这些操作时会出现问题:
ptr[0].setspeed(9);
ptr++->setspeed(13);
我正在使用DDD(gdb图形)调试器,当我显示ptr时,我只看到它指向一个对象。当我尝试设置速度时,第一个似乎工作,但第二个不会(速度默认为0)。打印只会变成垃圾。
我不太确定发生了什么,请帮助。
当我这样做时:
ptr->print();
应该同时为ptr[0]
和ptr[1]
打印,还是只打印ptr[0]
?
此外,有人可以快速绘制出ptr
和新动态类的外观吗?我看到它的方式,它是一个指向数组的ptr,数组大小为2,每个都有一个动物对象。
#include <iostream>
using namespace std;
class animal
{
private:
int speed;
double position_x;
double position_y;
public:
animal() : speed(0), position_x(0), position_y(0)
{
}
animal (int v, double x, double y)
{
this->speed = v;
this->position_x = x;
this->position_y = y;
}
animal(const animal & g)
{
this->speed = g.speed;
this->position_x = g.position_x;
this->position_y = g.position_y;
}
~animal();
void print();
int getspeed() { return this->speed; }
int getx() { return this->position_x; }
int gety() { return this->position_y; }
void setspeed(int s) { this->speed = s; }
};
void animal::print()
{
cout << "speed: " << this->getspeed() << endl;
cout << "position_x: " << this->getx() << endl;
cout << "position_y: " << this->gety() << endl;
}
int main()
{
animal *ptr;
ptr = new animal;
ptr = new animal [2];
ptr[0].setspeed(9);
ptr++->setspeed(13);
ptr->print();
cout << ptr[0].getspeed() << endl;
cout << ptr[1].getspeed();
return 0;
}
答案 0 :(得分:6)
而不是
ptr[0].setspeed(9);
ptr++->setspeed(13);
您可以使用更直观,更正确的
ptr[0].setspeed(9);
ptr[1].setspeed(13);
当你执行++时,你正在改变ptr的值,所以它将指向下一个元素。你应该保留一个指向数组开头的指针,以便稍后删除[]。
此外,ptr ++递增指针但返回旧值。也许你想要(++ ptr) - &gt; setspeed(13),它会增加并在表达式的其余部分使用 new 值。
至于您的其他问题,ptr->print()
与ptr[0].print()
相同,(ptr+1)->print()
与ptr[1].print()
相同。没有内置语法可以在所有元素上调用print()
。
答案 1 :(得分:6)
好的,有人已经向你指出了the memory leak issue。
所以,你已经分配了一个包含两个动物(ptr = new animal [2];
)的数组,并在ptr
中存储了指向第一个动物的指针。
+----------+----------+
| speed: 0 | speed: 0 |
+----------+----------+
^
|
|
ptr
(为了空间,我忽略了position_x
和position_y
然后将第一个的速度设置为9(ptr[0].setspeed(9);
):
+----------+----------+
| speed: 9 | speed: 0 |
+----------+----------+
^
|
|
ptr
然后你做了一些非常奇怪的事情。
ptr++->setspeed(13);
为什么你这样做,我不知道。不要这样做。我不是在开玩笑。我可以弄清楚这段代码的含义,但我永远不会写出这样的东西。它只会引起混乱。
但是让我们暂时假装这是理智的事情... ptr++
递增指针,并返回旧值。
+----------+----------+
| speed: 9 | speed: 0 |
+----------+----------+
^ ^
| |
| |
result ptr
of ptr++
...然后它将该结果指向的动物的速度设置为13。
+-----------+----------+
| speed: 13 | speed: 0 |
+-----------+----------+
^ ^
| |
| |
result ptr
of ptr++
最后,ptr->print()
打印ptr
所指向的动物,这是第二个。
答案 2 :(得分:5)
我的c ++很生疏,但这就是我的想法:
ptr++->setspeed(13);
这是一个后增量。 ptr
首先评估,然后递增。意味着在指针的原始值上调用setspeed
。
就我个人而言,我认为这种代码风格是不可接受的,我会解雇任何写这篇文章的人。它很难阅读,应该易于阅读和理解。
答案 3 :(得分:0)
如果++运算符在变量(ptr ++)之后,它将首先进行评估,然后进行增量。 这意味着这句话
ptr++->setspeed(13);
作为
ptr->setspeed(13) // ptr point to animal[0]
ptr++ // ptr point to anima[1] after this statement
++ ptr-&gt; setspeed(13)将以相反的方式工作。
现在您可以看到问题所在。你实际上在动物[0]上调用了setspeed(13),在动物[1]上调用了print()。