1

私はc++を学んでいますが、次の疑問があります。

実行時に配列を初期化したいのですが、配列のサイズも実行時に読み取る必要があります。

int size;

int main(){
    //read size
    size = <value read above>;
    CIwUIButton* buttons[size];
}

これはコンパイルされず、size定数である必要があります。私はJavaのバックグラウンドを持っており、同じロジックに従うことで同じ機能を実現できました.C ++でそれを行う方法.

ベクトルを Java ArrayList と同等のものとして使用しています。メイン外のベクトルへの参照が必要ですが、メイン内で初期化したいと考えています。再び max_size はユーザー入力から読み取られ、すべての要素は 0 に初期化される必要があります。

vector<int> elements;

int main(){
    //read size
    int size = <value read above>;
    //how to do following in c++
    elements = new vector<int>(size);
}
4

10 に答える 10

6

そうです、C++ は Java ではなく、Java は C++ ではありません。どちらも別々の言語です。

「もの」の数が不明な場合は、 を使用するか、 を使用してvector動的に割り当てる必要がありますnew。したがって、ポインタsizeの数が必要な場合:CIwUIButton

CIwUIButton** buttons = new CIwUIButton*[size];

(後で使用するようにしてくださいdelete [] buttons- 各ボタンを削除した後)。

sizeボタンの数が必要な場合:

CIwUIButton* buttons = new CIwUIButton[size]; 

繰り返しますが、上記と同じようにdeleteボタンを使用しますが、ボタン自体を削除する必要はありません)

にも使用できvectorますCIwUIButton

次に呼び出されるグローバルベクトルの整数のサイズ数が必要な場合elements

elements.resize(size);

(オブジェクトを呼び出す必要がある状況はほとんどありません。newそれvectorを行う理由が正確にわかっていない限り、それはおそらく間違っています)

于 2013-07-27T07:37:17.193 に答える
1

最初の部分。

次のように配列を動的に割り当てる必要があります。

CIwUIButton** buttons = new CIwUIButton*[size];

(デストラクタと削除 [] を使用して、そのオブジェクトとその要素を削除することを忘れないでください。)

デフォルト以外のコンストラクターを使用する場合は、各オブジェクトをループで初期化する必要があります。

 for(int i=0;i<size;i++) {
    buttons[i] = new CIwUIButton(x,y);
 }

2 番目の質問。

 std::vector<int> elements;

サイズを指定する必要はありませんが、次のようにサイズを定義できます。

 elements.resize(size);
于 2013-07-27T07:34:45.460 に答える
1

C++ では、RAIIとして知られるこのイディオムに従います。
リソースの取得は初期化です。

スコープ内でオブジェクト A のインスタンスを宣言すると、次のようになります。

{
    A instance;
}

このオブジェクトは、スコープを離れると破棄されます。

global のstd::vector<int>場合、プログラムの実行開始時に作成および初期化され、プログラムの終了時に割り当てが解除されます。

newそのような場合はandは必要ありませんdelete


std::vectorにはresize、内部配列のサイズを変更できるメソッドがあり、 を介して要素にアクセスして変更できますoperator[]。サイズ変更しなくてもpush_backできます。emplace_back

于 2013-07-27T07:43:18.687 に答える
0

new を使用するには、vector<int>*ポインタが必要です。C++ で推奨される解決策は、次のvector<T>::resize()操作を使用することです。

vector<int> elements;

int main(){
    //read size
    int size = <value read above>;
    //how to do following in c++
    elements.resize(size,0);
}
于 2013-07-27T07:34:19.423 に答える
0

可変長配列は C99 で導入されましたが、C++ ではサポートされていません。

使用するにはvector

vector<int> elements;

int main(){
    //read size
    int size = <value read above>;
    elements.resize(size);
}
于 2013-07-27T07:37:19.320 に答える
0

std::vector には固定サイズがありません。特定のサイズに初期化する理由はありません。必要に応じて大きくなります。elements.reserve(size)サイズ要素(例ではint)にスペースを割り当てることができます。

t およびすべての要素を 0 に初期化する必要があります。

要素ベクトルは、コンストラクターを呼び出すことによって構築されるオブジェクトのポインターではなく、ヒープに割り当てられていないため、動的メモリ管理は必要ありません。

newand delete( deletes を忘れないでください。スマート ポインターを使用することをお勧めします) は、ポインターでのみ使用されます。

例 :

int main()
{
  std::vector<int> elements; // not a pointer constructor called because of this statement
  std::vector<int> *elements_ptr = new std::vector<int>(); // this is a pointer pointers have asterisks as part of their declaration and these are initialized via new they simply contain a memory location
  // do stuff here
  delete elements_ptr; // frees allocated memory and calls the destructor for the object 
  return 0;
} // elements destructor is called when it goes out of scope

この言語に慣れていない場合は、C++ に関する本を読むことを強くお勧めします。これらは、そのような資料で最もよく説明されています。

Bjarne Stroustrup による deitel の C++またはC++ プログラミング言語のプログラミング方法をお勧めします。

于 2013-07-27T07:38:37.610 に答える
0

次のように vector を使用できます。

vector<int> elements;

int main(){
    //read size
    int size = <value read above>;
    //how to do following in c++
    elements.resize(size, 0);
}
于 2013-07-27T07:36:03.187 に答える
0

Java では、すべての新しいオブジェクトを「new」キーワードで作成する必要がありますが、C++ では常にそうとは限りません。elements は、その宣言によって構築されたオブジェクトになり、main ですぐに使用できます。resize メソッドを呼び出すことで、そのサイズを設定できます。または、メインで要素を宣言し (グローバル変数として外部ではなく)、ベクトルのサイズをコンストラクターの引数として渡すことができます。

これらは基本的なトピックであり、続行する前に C++ のチュートリアルを読むことをお勧めします。

ボタンを

vector<CIwUIButton *>

クラスコンストラクターでそのサイズを設定します。ただし、ボタン要素の作成方法も管理する必要があります。

于 2013-07-27T07:36:31.523 に答える
-3

メモリを動的に割り当て、malloc を使用し、作成したポインタに sizeof(yourClass) * size を割り当てる必要があります。

于 2013-07-27T07:34:00.333 に答える