所以我有一个“大”类A
,另一个类B
将包含至少 100 个对象的向量A
。B
将类中的所有对象存储为a 似乎不是一个好主意,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
和,而只需要一次。对于我应该设置的每个元素都是不同的。A::c
A::a
为了说明我想要这个的原因:类A
在我的程序中是一个Sprite
类,并且B
必须能够将精灵打印为图块并命名为TileMap
. 因此,向量中TileMap
的很多Sprite
s 都可以在窗口上绘制,但是对于所有这些图块(纹理图块大小、绘图图块大小、纹理文件等),很多信息都是完全相同的,而我没有想要为每个图块设置所有这些变量。我想创建某种模板,可用于Sprite
向量中的每一个。这种方式不仅更容易,占用空间更少,而且更安全:我知道所有这些值将完全相同。