课程和指针,它们如何工作?

时间:2012-02-02 02:31:05

标签: c++ pointers

主要问题是创建动态类。我做了什么:

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;
    }

4 个答案:

答案 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_xposition_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()。