0

C++ に関する本を読んでいます。そして、自分が知っていることを少し練習する必要があると考えました。そこでクラスを作成しましたが、必要なスペースの量がわからなかったので、classname * name[]後で割り当てるフォームのメンバーが含まれていました。newそのため、入力しようとしてname = new classname[capacity /* a variable passed in constructor */]もうまくいきませんでした。今考えると、これは理にかなっている。name著書を参照したところ、それは と同じであることに気づきました&name[0]。これは、私のIDEが「式は変更可能な左辺値でなければならない」と言った理由を説明しています。だから今、私の質問は、ある行で配列を宣言し、new別の行でそれを割り当てるにはどうすればよいですか? type * name[]クラスメンバーとしては有効であるのに、クラス外では有効ではない理由も知りたいですか?

class MenuItem
{
public:
    MenuItem(string description):itsDescription(description) {};
    void setDescription(string newDescription);
    string getDescription() const;
private:
    string itsDescription;
};

void MenuItem::setDescription(string newDescription)
{
    itsDescription = newDescription;
}

string MenuItem::getDescription() const
{
    return itsDescription;
}

class Menu
{
public:
    Menu(int capacity);
private:
    MenuItem * items[];
};

Menu::Menu(int capacity)
{
    items = new MenuItem("")[capacity];
}

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

4

2 に答える 2

4

Java とは異なりMenuItem* items[]、適切な型ではなく、3 つの状況でのみ許可されており、これらの状況のいずれにも使用されていません。あなたの質問の残りの部分から判断すると、動的にサイズ変更されたMenuItemアイテムの配列が必要だと思います。その場合、メンバーは単にMenuItem* items;. 次に、そのオブジェクトの配列を問題なく割り当てることができます。

int capacity = 4;
items = new MenuItem[capacity]; //these are default initialized

コメント (および投票者?) が言うように、「最善の」解決策は、単にstd::vector<MenuItem> items代わりにメンバーを使用し、自動的に割り当てと割り当て解除を処理させることです。

教育的ですが、それほど重要ではありません:
C++ で空の括弧を使用できるのは次の場合のみです[]

// as array parameters (don't be fooled, this is actually a pointer)
void myfunction(int array[]) 

// as local array defintion BUT ONLY WHEN IMMEDIATELY ASSIGNED VALUES
int array[] = {3, 6, 1};

// as the last member of an extensible object, for a C hack.

struct wierd {
    int array[];  // effectively a zero length array
};
wierd* dynamic = malloc(sizeof(wierd) + capacity*sizeof(int));

// don't do this in C++
// Actually, I think this is technically illegal as well, 
// but several compilers allow it anyway.
于 2012-04-11T21:47:12.850 に答える
0

C では、配列はその最初の要素のアドレスによって参照されます。ポインタがアドレスを参照していることに気付くでしょう...

MenuItem * items;
items = new MenuItem[size];

この場合、items は 1 つ以上の MenuItem インスタンスへのポインタです。この場合、C++ は同じです。これは単純化されたバージョンです。配列へのポインターをパラメーターとして渡したい場合は、考慮すべき複雑さが他にもありますが、そこにたどり着いたら、それらを理解できると確信しています。

念のため、あなたが持っていたコードで:

MenuItem * itemsarr[];   // invalid still because no array size

この場合、Itemsarr を MenuItem インスタンスへのポインタの配列として宣言しています。以下のペンダントコメントが示すように、正当な配列サイズを指定しない限り、これ自体は一般的に有効な構文ではありません。

MenuItem * itemsarr[20];  // would be valid

編集:ペダンフレンドリーにしました。

于 2012-04-11T21:50:09.173 に答える