-1

2 次元のポインター クラス配列を作成しようとしています。クラスオブジェクトのグリッドが必要だからです。現在、次のようなエラーが表示されます。

testApp.cpp|53|エラー: '((testApp*)this)->testApp::myCell[i]'| の 'operator[]' に一致しません

// this is cell.h
class Cell
{


public:
    int x;
};

.

// this is testApp.h

class testApp : public ofBaseApp{
public:

    int width;
    int height;
    int Grid;
    int space;
    float wWidth;
    float wHeight;
    Cell myCell;


    void setup();
    void update();
    void draw();
};

.' // これは testapp.cpp です // これがエラーの場所です

 void testApp::setup(){


Cell *myCell[5][5];
myCell[1][0]->x =2;
myCell[2][0]->x =1;
myCell[3][0]->x =23;
myCell[4][0]->x =4;
myCell[5][0]->x =7;
myCell[0][0]->x =4;



}

//--------------------------------------------------------------
void testApp::draw(){

ofSetColor(255,255,0);
for (int i = 0; i<5; i++) {
    int q = myCell[i][0]->x;     // i get the error here. 
    ofCircle(20*q,20*q,50);
}
}

myCell ポインターと x パラメーターのアドレス指定に問題がある理由がわかりません。

どんな助けでも大歓迎です。

4

3 に答える 3

2

。という名前の2つのオブジェクトがありますmyCelltestApp1つ目はwithタイプのメンバーですCell

class testApp : public ofBaseApp {
  public:
    // ...
    Cell myCell;
    // ...
}

名前の付いた他のオブジェクトは関数でmyCell作成され、タイプはです。testApp::setup()array of 5 array of 5 pointer to Cell

void testApp::setup() {
    Cell *myCell[5][5]; // This hides the previous myCell
    // ...
}

setup()関数内で、メンバーを非表示にしていますmyCell。関数が終了すると、の配列バージョンはmyCellスコープ外になり、存在しなくなります。したがって、まず最初に、メンバーの定義を修正しますmyCell

class testApp : public ofBaseApp {
  public:
    // ...
    Cell* myCell[5][5];
    // ...
}

そして、の定義を削除しmyCellますsetup()

void testApp::setup() {
    // ...
}

myCellこれで、へのポインタの2D配列であるというオブジェクトが1つだけ呼び出されましたmyCell。しかし今、私たちは解決すべき別の問題を抱えています。このポインタの配列がありますが、現在どこも指していません。初期化されていません。インデックスでポイントされているオブジェクトmyCell[1][0]->xがないため、単に実行しようとすることはできません。Cell[1][0]

newこれを回避する1つの方法は、すべてのにスペースを動的に割り当てるために使用して、配列全体をループすることCellです。これは次のように行います。

void testApp::setup() {
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            myCell[i][j] = new Cell();
        }
    }
    // ...
}

ただし、はるかに優れた方法は、動的割り当て(new)をまったく使用しないことです。へのポインタの配列ではなく、のmyCell配列として定義するだけの場合、sはスタックに自動的に割り当てられます。これには、メンバー定義を次のように変更することが含まれます。CellsCellCell

class testApp : public ofBaseApp {
  public:
    // ...
    Cell myCell[5][5];
    // ...
}

これで、testAppインスタンスが作成されると、配列が自動的に割り当てられます。これで、配列の内容を次のように設定できます。

void testApp::setup() {
    myCell[1][0].x = 2;
    myCell[2][0].x = 1;
    // ...
}
于 2012-10-06T11:49:34.517 に答える
1

myCellでfromtestApp::setup()を参照しようとしているようですが、そこにあるtestApp::draw()メンバーにしかアクセスできません。testApp::myCellこれはタイプCellであるため、必要な操作をサポートしていません。

編集

あなたが言及しているクラッシュの考えられる原因の 1 つは、setup()関数である可能性があります。そこでは、統一化されたポインターを使用しています。コメントで言及した変更により、セットアップのコードを次のように変更する必要があります。

void testApp::setup(){
  //remove the next line to not shadow the member declaration
  //Cell *myCell[5][5];
  //replace -> by . as you are not handling pointers anymore
  myCell[1][0].x =2;
  myCell[2][0].x =1;
  myCell[3][0].x =23;
  myCell[4][0].x =4;
  myCell[5][0].x =7;
  myCell[0][0].x =4;
}
于 2012-10-06T10:46:39.370 に答える
0

変数myCellは のスコープ内でのみ定義されていますtestApp::setup。したがって、 のスコープ内でアクセスすることはできませんtestApp::drawtestAppクラスの属性にすることを考えてください。

于 2012-10-06T10:58:43.947 に答える