3

非常に単純な質問です。ヒープ内に存在する構造体のデータにアクセスするにはどうすればよいですか?

追加情報:: 「A」というクラスと、このクラス内に「B」という構造体があります。作成されるすべての「B」はヒープ上に存在します。クラス "A" は、プライベート データ メンバーとして "B" のベクトルを持つことを意図しています (つまり、クラス "A" は多くの "B" を保持できます)。「A」が持つベクターに「B」の別の新しいインスタンスを追加するクラス「A」のメソッドがあります。クラス「A」には、「B」インスタンスのベクトルにあるすべての要素を更新する別のメソッドもあります。私の質問は次のとおりです。

構造体でゲッターとセッターを使用するにはどうすればよいですか?

役立つコードを次に示します (注: grafix.h はグラフィカル ライブラリです)。

//.h file
#pragma once
#include <vector>
#include "grafix.h"

class A
{
    public:
        ~A();
        A();

        void addB();
        void updateB();

    private:

        struct B
        {
                 public:
                     ~B()
                     {
                           delete p_b;
                     p_b = 0;
                     }

                     B()
                     {
                     p_b = new B; //I need this here

                     p_ball->x = 0;
                     p_ball->y = 0;
                     p_ball->r = 15;

                      }
                      void setxy(int X, int Y) 
                      {
                     //What does this look like?
                                       //This?
                                       x = X; //?
                                       y = Y;
                      }

                      int retx()
                      {
                                        //Likewise.... ?
                      return x; //?
                      }


                      int rety()
                                  {
                                         return y;
                                  }

                       void update()
                       {
                          draw();

                                           //Movement code taken out for time being
                       }

                  private:
                       int x,y; //xy
                       int r; //radius


                       B* p_b; //pointer to object, do I need this?

                       void draw()
                       {
                         draw_circle_filled(x,y,r); 
                                          //how can I access the data within the struct B here?
                                          //do I use the getters/setters? dereference??
                       }

          };

vector <Ball*> bs; //Holds all of the B's that have been created

};

そして、メソッドを含む .cpp ファイル。ここで質問があります。正しい構文で入力していますか??

#include "A.h"

A::A()
{
        addB();
}

void A::addB()
{
      B* b;

      bs.push_back(b);
}

void A::updateB()
{
       for(int i = 0; i < bs.size(); i++)
       {
            bs[i]->update();
       }
}
4

1 に答える 1

1

これは犯罪です:

void A::addB()
{
      B* b;

      bs.push_back(b);
}

B* bは初期化されていません。コンテナ内でそれを参照することは犯罪です。このアドレスを逆参照することは意味がなく、未定義の動作/クラッシュです。

このように割り当てる必要があります:

{
      B* b = new B;

      bs.push_back(b);
}

編集:Kevinが以下にコメントしたように、まだメモリリークがあります。のコンテナを使用することをお勧めしますstd::shared_ptr<B>。このようにして、誰も shared_ptr を指していないときに B オブジェクトが削除されます。

于 2012-11-19T23:03:59.697 に答える