-1

メイン ウィンドウで、PointerObject へのポインターの配列を保持する PointerClass のインスタンスを作成します( PointerObject [ X ][Y]アクセスて同じ方法で削除し、PointerObject[X]かどうかを確認します)。 [Y] == NULL (これがポインターを使用する理由です)) であり、ベクトルを使用したソリューションは必要ありません。

#define X 10
#define Y 10

class PointerObject
{
public:
        int X;
        int Y;
}

class PointerClass
{

public:
       PointerObject       *ArrayOfPointerObjects[X][Y];
}

PointerMethod(&PointerClass);

次に、PointerMethod で配列への Pointer を作成します。

PointerMethod(PointerClass *pointerClass)
{
     // don't know the right way to do this
     pointerClass->ArrayOfPointerObjects= new PointerObject[X][Y];

     // set all pointers in the array to NULL - is this needed?
     for (int x=0; x < X; x++)
     {
         for (int y=0; y < Y; y++)
         {
              pointerClass->ArrayOfPointerObjects[x][y] = NULL;
         }
     }

     // trying to store some data here
     pointerClass->ArrayOfPointerObjects[0][0] = new PointerObject;

     // trying to delete it
     delete pointerClass->ArrayOfPointerObjects[0][0];
     // or trying this:
     delete[] pointerClass->ArrayOfPointerObjects[0][0];

     // causes access violation or doesn't work
}

私は以前、間違ったタイプについての成功や質問なしでこれを尋ねました。

別のポインタを介してクラス内の多次元配列へのポインタを削除します - どのように?

配列にアクセスして、NULL かどうかを確認できます。しかし、delete / delete[] pointerClass->ArrayOfPointerObjects[x][y] を呼び出すと、[X][Y] の要素ではなく、pointerClass へのポインターを削除するように見え、場所 [X] のポインターを削除したい[Y] pointerClass ではなく、配列全体を削除したくありません。

あまり複雑にせずにこれを行うにはどうすればよいですか? 私の配列は実際にはポインターの配列ではなく、配列へのポインターにすぎないと思います。しかし、ポインタなどに格納されたポインタの配列にしたいのです。それでも重要なのは、アクセスする方法と、配列内の要素を削除する方法です。ポインターが NULL かどうかを確認し、その単一の PointerObject を削除できない場合は確認できる必要があります。

これの重要性は、私がしたいことです:

  1. [X][Y] で PointerObjects の配列にアクセスする
  2. 配列内のオブジェクトが NULL (= ポインターが必要) かどうかを確認します
  3. PointerClass オブジェクトへのポインターを破棄したり、残りの配列を削除したりせずに、ポインターの配列内の 1 つの項目を削除します。削除後の [X][Y] = NULL になるように、配列内の特定の X、Y 位置にある単一の PointerObject を削除するだけです。

私の他のスレッドとの混乱や類似性が多すぎる場合、それは人々が私が望んでいないことを私に言い、それが主題から外れたためです。

4

1 に答える 1

-1

うーん、私はこのようなことを考えます

#include <iostream>

class Foo 
{
    int i_;
    int j_;
public:
    Foo(int i, int j) : i_(i), j_(j) {}

    void print_coords()
    {
        std::cout << this << " (" << i_ << ',' << j_ << ')' << std::endl;
    }
};

class Bar
{
public:
    Foo *arr[5][5];  
};

class Que
{
public:
    void init(Bar *b)
    {
        for(int i=0; i<5; i++)
            for(int j=0; j<5; j++)
                b->arr[i][j] = new Foo(i, j);
    }

    void print(Bar *b, int i, int j)
    {
        try {
            if(b->arr[i][j])
                b->arr[i][j]->print_coords();
            else
               throw 0;
        } catch (int e) {
            std::cout << &b->arr[i][j] << " points to null" << std::endl;
        }
    }

    void rem(Bar *b, int i, int j)
    {
        delete b->arr[i][j];
        b->arr[i][j] = 0;
    }
};

int main()
{
    Bar *b = new Bar();
    Que *q = new Que();

    q->init(b);
    q->print(b, 2, 2);
    q->rem(b, 2, 2);
    q->print(b, 2, 2);

    return 0;
}
于 2012-08-18T22:15:09.073 に答える