2017-11-14 3 views
0
上のポインタの配列を割り当てる

いXのオブジェクトのための領域を割り当てる?:私は、ヒープ上のx Vector3Dオブジェクトのためのスペースを持つ配列を構築する必要がありヒープ

Vector3D* binArray = new Vector3D[size]; 

単純X新しいオブジェクトを作成、または以下。しかし、Vector3Dオブジェクトは、「add」関数が呼び出されたときにのみ作成できます。これは、パラメータを取り、ヒープ上でオブジェクトを構築し、そのアドレスをVector3Dポインタの配列に追加します。

+0

をあなたが新しいと呼ばれている - これはあなたがなることを意味コンストラクタを呼び出す。 –

+1

std :: vectorを使用してください! –

答えて

4

これは、ヒープ上にVector3Dオブジェクトの配列を作成します。

各ベクターは、Vector3Dコンストラクタを呼び出すことによって作成されます。

Vector3Dのデフォルトのコンストラクタに少しのデバッグ用のprint文を入れて、配列内のベクトルと同じ回数だけコンストラクタが呼び出されるのを見てください。

例:

#include <iostream> 
using namespace std; 

class C { 
public: 
    C() { cout << "Hello default constructor here\n"; } 
}; 

int main() { 
    C* cs = new C[5]; 
} 

出力は次のとおりです。

Hello default constructor here 
Hello default constructor here 
Hello default constructor here 
Hello default constructor here 
Hello default constructor here 

あなたのクラスは、デフォルトコンストラクタを持っていない場合、あなたは一発で配列を割り当てることができません(コメント@Everyoneをありがとうございました)したがって、この場合は、std::vectorまたはstd::arrayを使用し、Vector3Dオブジェクトを動的に追加することも、「静的に」追加することも検討してください。例:

#include <iostream> 
#include <vector> 
using namespace std; 

class Vector3D { 
    double i, j, k; 
public: 
    Vector3D(double i, double j, double k): i(i), j(j), k(k) {} 
}; 

int main() { 
    vector<Vector3D> v = { 
    Vector3D(3, 4, 5), 
    Vector3D(6, 8, 10), 
    Vector3D(7, 24, 25) 
    }; 
    v.push_back(Vector3D(1, 2, 3)); 
    cout << v.size() << '\n'; 
} 

この出力4.

また、あなたのベクトルがVector3Dオブジェクトへのポインタを含めることができます。

+1

私は、彼がデフォルトコンストラクタを持っていなければ、これは動作しないことに注意する価値があると思います。ちょうど完成のために。 – Everyone

+0

したがって、プライベートメンバーとして(サイズxの)Vector3Dオブジェクトの配列を持つことができ、各オブジェクトを動的に個別に構築して割り当てることができます。 – Edward

+0

配列をメンバにしたいが、配列の各メンバをヒープ上に置くには?私が最後に行った編集は、正直言ってVector3Dオブジェクトを配列、std :: array、またはstd :: vectorに直接格納するのに役立つはずです。簡単だと思います。あなたは事前に知られているあなたの配列のサイズです(1)を明確にすることはできますか? (2)Vector3Dオブジェクトはヒープ上になければならないのですか、または値で割り当てられるのは問題ありませんか? –

0

RayToalの優れた答えに対する質問者のコメントに基づいて追加するだけです。ランタイムに先立ってbinArrayのサイズがわからない場合は、std::vectorを使用する必要があります。各項目を単独で割り当てる場合は、std::vector<Vector3D*>を使用することをおすすめします。

実行時にstd::vectorのサイズを変更することができます。これを行うと、割り当てられていない束がnullptr個保持されます。次に、それらのそれぞれを個別に割り当てることができます。

std::vector<Vector3D*> binArray; 
binArray.resize(x); // now you have binArray of size x and no allocated elements 
binArray[0] = new Vector3D(...); 

あなたがメモリリークを持っていないためにそれらを使用していない後にあなたがそれらを削除する必要がありますのでご注意ください:

for(size_t i=0;i<binArray.size(); i++) 
    if(binArray[i]!=nullptr) delete binArray[i];