如何创建 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 不包含该类的某些成员的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个存储指向成员函数的指针的类 (C++)

c++模板问题

创建一个包含该类所有实例的静态成员容器的类?

如何在 C++ 中调用父类中的函数? [复制]

创建 C++ 类的存根版本

调用非静态成员函数而不创建实例