したがって、「大きな」クラスがあり、少なくとも100個のオブジェクトのベクトルを保持するA
別のクラスがあります。多くの情報を再利用できるため、すべてのオブジェクトをとしてクラスに格納することはお勧めできません。B
A
B
vector<A>
クラスB
に、同様のプロパティをすべて保持しA
、それに作成するテンプレートを用意することを考えてvector<A*>
いました。しかし、それはそれらをすべて同じにします...
いくつかの違いだけを複数回保存する必要があるように、クラスの同様の変数を保存する方法はありますか?
最小限の作業例
#include <iostream>
// suppose an int is big:
struct A { // create struct which holds 3 ints
A() : a(0),b(0),c(0) {} //ctor
void print() { // print all variables
cout << a << ", " << b << ", " << c << endl;
}
int a,b,c;
};
class B { // create object that holds a vector of A
public:
B(int vectorSize) {
vector_A.resize(vectorSize);
vector_ptr_A.resize(vectorSize);
}
void initValues() {
///////////////////////////////////////
// METHOD 1
vector_A.resize(vectorSize); // resize
for (int i=0; i<vector_A.size(); ++i) {
vector_A[i].a = rand() % 100; // randomize A::a
vector_A[i].b = 5; // only B wants A::b to be 5
vector_A[i].c = 10; // only B wants A::c to be 10
}
///////////////////////////////////////
///////////////////////////////////////
// METHOD 2
A_template.b = 5; // only B wants A::b to be 5
A_template.c = 10; // only B wants A::c to be 10
vector_ptr_A.resize(vectorSize,&A_template); // point to template
for (int i=0; i<vector_ptr_A.size(); ++i) {
vector_A[i].a = rand() % 100; // randomize A::a
}
///////////////////////////////////////
}
void print1() { // prints vector_A[i]
for (int i = 0; i < vector_A.size(); ++i) {
vector_A[i].print();
}
}
void print2() { // prints vector_ptr_A[i]
for (int i=0; i < vector_ptr_A.size(); ++i) {
vector_ptr_A[i]->print();
}
}
// method 1
vector<A> vector_A; // a big, big vector
// method 2
A A_template;
vector<A*> vector_ptr_A; // all the same
};
int main() {
srand( time(NULL) );
B b(10);
b.initValues();
cout << "METHOD 1\n";
b.print1(); // as desired, but inefficient
cout << "\nMETHOD 2\n";
b.print2(); // all the same output
}
編集
最小限の作業例が少し混乱しているため、いくつかの明確化。また、より明確にするために今それを適応させました。
クラスのメンバーは、ユーザーA
によって設定されることを意図してB
います。ユーザーは、たとえばA::a
、ベクトルの各要素 (乱数で表される) を定義し、他の 2 つ (A::b
およびA::c
) は で定義されB
ます。クラスA
は だけが使用するクラスではなくB
、ユーザーまたは他のクラスによっても使用されます。
したがって、基本的にはメソッドを求めているので、ベクターのすべての要素に対してA::b
andを設定する必要はありませんがA::c
、1 回だけです。A::a
設定する要素ごとに異なります。
これが必要な理由を説明するには、クラスA
は私のプログラム内のSprite
クラスでB
あり、スプライトをタイルとして印刷できる必要があり、という名前が付けられてTileMap
います。このように、ベクトルはウィンドウに描画できるTileMap
多くの を保持しSprite
ますが、多くの情報はそれらすべてのタイル (テクスチャ タイル サイズ、描画タイル サイズ、テクスチャ ファイルなど) でまったく同じであり、私はそうではありません。すべてのタイルにこれらすべての変数を設定したいと考えています。Sprite
ベクター内のすべてに使用できるある種のテンプレートを作成したいと思います。この方法は、より簡単で省スペースであるだけでなく、より安全でもあります。これらの値はすべてまったく同じになることがわかっています。