1

私は c++ の初心者で、動的メモリを使用して基本的なオブジェクトを作成しようとしています。メソッドに int 引数を渡していますが、グローバル変数の値を変更しています。新しいオブジェクトにメモリを割り当てる方法と関係があると思います。他の方法でコンパイルすることはできません。

int main () {
    int inp;
    CRectangle rectb (2,2);
    cout << "enter number of items to add" << endl;
    cin >> inp; // let's say inp = 7
    rectb.addItemsArray(inp);
    cout << "inp after adding items: " << inp << endl; // inp is now 1.
}

ヘッダファイル:

class CRectangle {
    int width;
    int height;
    item *items[]; // SOLUTION: change this line to "item *items"
    int input;

public:
        CRectangle (int,int);
        int addItemsArray(int);
        int area () { return (width*height); }
        int get_items(int);

};

-と-

class item {
    int foo;
    char bar;
public:
    //SOLUTION add "item ();" here (a default constructor declaration without arguments)
    item (int, char);
    int get_foo();
    char get_bar();
};

方法:

int CRectangle::addItemsArray(int in) {
    cout << "value of in at begginning:" << in << endl; //in = 7
    int i;
    i = 0;
    //SOLUTION: add "items = new item[in];" on this line.
    while (i < in) {
        items[i] = new item(1, 'z'); //SOLUTION: change this line to "items[i] = item(1, 'z');"
        i++;
    }
    cout << "value of in at end " << in << endl; //in = 7
    return 1;
}

バスエラーやセグフォルトが発生することがあります。2 や 3 などの低い数値で期待どおりに動作することもありますが、常にそうとは限りません。

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

編集 (CRectangle のコンストラクター):

CRectangle::CRectangle (int a, int b) {
    width = a;
    height = b;
} 

(アイテムのコンストラクター):

/* SOLUTION add default item constuctor
item::item() {
    foo = 0;
    bar = 'a';
}
*/

item::item(int arg, char arg2) {
    foo = arg;
    bar = arg2;
}
4

2 に答える 2

4

問題は、入れたポインターにストレージを割り当てていないことですitems。変更することをお勧めします:

item *items[];

std::vector<item*> items;

次に、次のように項目を追加します。

items.push_back(new item(1, 'z'));
于 2012-04-17T13:52:20.790 に答える
1

アイテム配列を作成するのを忘れたようです...

動的に割り当てられた配列を定義しました (アイテム *items[100] ではなく、アイテム *items[])。配列を使用する前に、アイテムを保持するためにメモリを割り当てる必要があります。

items = new item[100];

で削除することを忘れないでください

delete [] items; 

最後に。;)

そして代わりに

int i;
i = 0;
while (i < in) {
   items[i] = new item(1, 'z');
   i++;
}

私は使うだろう

for (int i=0; i<in; i++)
{
   items[i] = new item(1, 'z');
}
于 2012-04-17T14:04:39.630 に答える