如何创建 C++ 用户定义的类,以便该类的 std::vector 不包含该类的某些成员
Posted
技术标签:
【中文标题】如何创建 C++ 用户定义的类,以便该类的 std::vector 不包含该类的某些成员【英文标题】:How to create a C++ user-defined class so that a std::vector of that class does not include certain members of the class 【发布时间】:2017-11-05 15:51:08 【问题描述】:我创建了一个类,我想在一个相当大的 std::vector 中使用它。但是,该类中的成员不会因向量中的每个元素而改变(以下示例中的cartesian
)。有没有办法创建我的类,所以当我制作它的向量时,向量中的所有元素都引用同一个变量?或者,更重要的是,一种不为整个向量中相同的成员使用内存的方法?我不想使用静态,因为它对于类的所有实例都将保持不变,并且这个值可能会因每个向量而改变。
例如
class foo
public:
int x,y,z;
bool cartesian;
foo(int _x =0, int _y=0, int _z=0, int _cart = true)
:x(_x), y(_y), z(_z), cartesian(_cart)
/* code */
;
int main()
std::vector<foo> vec1;
vec1.emplace_back(0,0,1);
vec1.emplace_back(0,0,2);
vec1[0].cartesian = false;
cout<< vec1[1].cartesian << endl;
return 0;
我想设置笛卡尔一次并为整个向量更改(因此在这种情况下,第二个元素 cartesian
成员也会变为 false。更好的是我不想使用内存来创建它向量中的每个元素。
【问题讨论】:
【参考方案1】:没有。只需创建一个关联变量,并将其与向量一起打包到一个结构中。
struct SomeFoos
std::vector<foo> theFoos;
bool cartesian;
;
【讨论】:
【参考方案2】:回答您的问题:并非如此。在 c++ 中,单个类的实例在结构上是相同的。即使您对要共享的值有共享引用,也不会在内存使用方面获得任何好处,除非该值是大于sizeof(void*)
的对象。
但是既然你说“我想设置笛卡尔一次并让它改变整个向量”,我读到:“为向量设置笛卡尔属性”:
我建议您创建一个以vector
作为超类的容器类;您的类将继承向量的行为,您可以在该容器类的实例中添加共享值。
【讨论】:
以上是关于如何创建 C++ 用户定义的类,以便该类的 std::vector 不包含该类的某些成员的主要内容,如果未能解决你的问题,请参考以下文章