0

私はopenglプロジェクトに取り組んでおり、いくつかのクラスで問題が発生しました:

3 つの主要なクラスがあります。


class scene{
public:
   scene();
   object** elements;
   unsigned int nb_elements;

   void add_object(object* _element){
       objet** p_elements=elements;

       while(p_elements-elements!=nb_elements)
           p_elements++;

      *p_elements=_element;                    //here is the bug
      nb_elements++;
    }


}
[...]
};

class object{
public:
    object();
    [...]
};

class point : public object{
point();
point(double _x, double _y, double _z,double _r);
[...]
}

Opengl を初期化した後、同じ関数でシーンを初期化します。

void GLWidget::initializeGL(){

   [OpenGL initialization]

   _scene=new scene;
   point* s1=new point(0.0,0.0,3.0,1.0);
   _scene->add_object(s1);

}

バグは Scene::add_object 関数にあります。*p_elements と _element はどちらもポインターであるため、なぜ機能しないのかわかりません。キャストの問題だと思いますが、修正方法がわかりません。動的キャストを試しましたが、バグは残っています。

ご協力ありがとうございました、

カマス

4

1 に答える 1

2

objet** p_elements=elements;p_elements初期化されていないメモリに設定します。したがってp_elements-elements!=nb_elements、未定義の動作p_elements++;を呼び出します。*p_elements=_element;メモリを初期化するようにアドバイスするつもりはありませんが、代わりにスマート ポインターを使用することをお勧めします。std::vector

二重ポインタは、C のバックグラウンドを持っていることを示唆していますが、C++ 開発を行いたい場合は、C++ イディオムを学ぶ必要があります。C コードを C++ で書くことに固執しないでください。

于 2012-10-09T16:07:44.763 に答える