簡體   English   中英

如何創建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

我創建了一個我想在大小相當的std :: vector中使用的類。 但是,該類中的成員對於向量中的每個元素都不變(下例中為cartesian )。 有沒有一種方法可以創建我的類,因此當我創建它的向量時,向量中的所有元素都引用同一個變量? 或者,更重要的是,一種不為整個向量都相同的成員使用內存的方法? 我不想使用static,因為它對於類的所有實例都將保持不變,並且此值對於每個向量都可能會更改。

例如

 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。甚至更好的是,我不希望使用內存為每個元素創建一個cartesian 。向量。

不需要。只需創建一個關聯變量,然后將其與向量一起打包到一個結構中即可。

struct SomeFoos
{
    std::vector<foo> theFoos;
    bool cartesian;
};

要回答您的問題:並非如此。 在c ++中,單個類的實例的結構相同。 即使您共享要共享的值的引用,也不會在內存使用方面獲得任何好處,除非該值是大於sizeof(void*)的對象。

但是,由於您說“我想設置一次笛卡爾坐標,並更改整個矢量”,因此我讀到:“設置矢量的笛卡爾坐標”:

我建議您創建一個將vector作為超類的容器類。 您的類將繼承vector的行為,並且可以在該容器類的實例中添加共享值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM