Elements of constructor get deleted by call from another class



  • I am defining an array with all its elements in the constructor of one class A. Now I want to use these values in my other class B.

    I am defining an Object A *a = new A() and call the array with a->array Unfortunately all the elements are deleted as soon as I am leaving the constructor from class A. Has anyone an idea why that is so?

    Here an update with a sample-code:

    First I have my class A:
    @
    class A()
    {
    QVector<Point3d> point_s;
    }

    A::A()
    {
    point_s.resize(5);
    for (int i = 0; i < 5; ++i)
    {
    point_s[i].x = i;
    point_s[i].y = i+1;
    point_s[i].z = i+2;
    }
    }
    @
    In class B I want to use the array-values. I am creating an Object from A.
    @
    #include "a.h"
    #include "c.h"

    class B : public QGLWidget
    {
    Q_OBJECT
    public:
    A *a;
    C *c;
    void paintGL();
    B(QWidget *parent = 0);
    }

    B::B(QWidget *parent) : QGLWidget(parent)
    {
    a = new A;
    b = new B;
    }

    void B::paintGL()
    {
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    gluPerspective(70, width() / height(), 0.01, 1000);

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    
    c->draw(a->point_s);
    
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    

    }
    @
    In class C I am defining the following. Maybe it doesnt make sense here but in my program it does and it is necessary.
    @
    class C
    {
    public:
    C();

    void draw_points(QVector<Point3d> point);
    void draw(QVector<Point3d> point) const;
    

    };

    C::C()
    {
    }

    void C::draw_points(QVector<Point3d> point)
    {
    int count =1;
    double angle= 360/count;

    for(int i=0;i<5;i++)
    {
        glRotated(angle,0,1,0);
        draw(point);
    }
    

    }
    void C::draw(QVector<Point3d> point) const
    {
    for(int i=0; i<point.size(); i++)
    {
    glBegin(GL_POINTS);
    glVertex3f(point.value(i).x,point.value(i).y,point.value(i).z);
    glEnd();
    }
    }
    @
    I hope you could help me now. Sorry for the late answer but I hadnt time the other days. The question still remains, why the array values get deleted.

    Thanks in Advance


  • Moderators

    Without seeing any code of yours it is hard to give a solid advice on the issue.
    You need to post some skeletons with the essential part of what you are doing.



  • [quote author="basil_fawlty" date="1328362457"]Unfortunately all the elements are deleted as soon as I am leaving the constructor from class A.[/quote]
    Most probably because you've declared the array on the stack, which means it is destructed once it gets out of scope.

    [quote author="basil_fawlty" date="1328362457"]I am defining an array with all its elements in the constructor of one class A. Now I want to use these values in my other class B.[/quote]
    Two possibilities:

    • declare the array as member of the class
    • create the array on the heap in the constructor, delete it in the destructor

    In both cases you should use a getter instead of a public variable to comply with the rule of encapsulation.



  • Sorry for my late update of the question,but I hadnt got time the other days. I thank you Lukas. I thought that my array is a member of my class.
    So you are suggesting to use getters. I have never come across using getters in c++. It looks rather complicated. Maybe you could tell me a bit more how to create a getter.

    Thanks in advance



  • Hm... Ok i have tried it like this:

    In a.cpp:

    @
    QVector<Point3d> A::get_m()
    {
    return this->point_s;
    }
    @

    In a.h:

    @
    QVector<Point3d> get_m();
    @

    In b.cpp:

    @
    b_points = a->get_m();
    c->draw(b_points);
    @

    Still the same. I am not getting it.



  • [quote author="basil_fawlty" date="1328568251"]So you are suggesting to use getters. I have never come across using getters in c++. It looks rather complicated. Maybe you could tell me a bit more how to create a getter.[/quote]

    It is nothing special. Just make your members private instead of public and add methods to get and set the value - like you did in your previous post.

    Your code works fine (apart from some slips of the pen in A #1 and B #17). glVertex3f() is called with the values specified in A::A(). So your error is either in the way you set up your OpenGL viewport or in code not shown here.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.