簡體   English   中英

Const指向指針數組的指針

[英]Const pointer to an array of pointers

我有這堂課

struct A {
    A();
    Item*  m_Items[ON_CPU + ON_GPU];
    Item** m_ItemsOnCpu;
    Item** m_ItemsOnGpu;
};

我需要初始化

m_ItemsOnCpu到m_Items

m_ItemsOnGpu到m_Items + ON_CPU

所以我需要const指針指向數組的兩個部分。 我如何聲明然后初始化它們?

在C ++ 11中,您可以這樣做:

struct A {
    A();
    Item*  m_Items[ON_CPU + ON_GPU];
    Item** const m_ItemsOnCpu = m_Items;
    Item** const m_ItemsOnGpu = m_Items + ON_CPU;
};

在其他版本的C ++中,使用初始化列表:

struct A {
    A() : m_ItemsOnCpu(m_Items), m_ItemsOnGpu(m_Items + ON_CPU) {};
    Item*  m_Items[ON_CPU + ON_GPU];
    Item** const m_ItemsOnCpu;
    Item** const m_ItemsOnGpu;
};

所以你想要這樣的東西:

struct A {
    A(): m_ItemsOnCpu(m_Items), m_ItemsOnGpu(m_Items + ON_CPU) {};
    Item*  m_Items[ON_CPU + ON_GPU];
    Item** const m_ItemsOnCpu;
    Item** const m_ItemsOnGpu;
}

據我了解,你想在m_Items的開頭有m_ItemsOnCpu點,在m_Items中間的某個地方有m_ItemsOnGpu。

通過指向Item指針,我不知道你想要實現什么。 您可以使用兩個單獨的Item *數組。 如果它們需要在內存中連續,那么類或結構成員會自動出現這種情況,盡管由於結構成員對齊可能會有一個小的間隙,在大多數編譯器上你可以設置為1個字節, 即MSVS

我想你想要const指針,所以你的類的用戶不能修改它們(const指針指向Item, Item ** const m_ItemsOnCpu )。 這可以通過使用getter函數而不是公開公開成員變量來實現。 Const對象需要初始化並且無法分配。 由於m_Items的地址是在運行時確定的,所以我沒有看到初始化const指針的方法。

另一個可能的目標是你不希望用戶修改m_ItemsOnCpu和m_ItemsOnCpu指向的指針(指向const指針的指針, Item * const * m_ItemsOnCpu )。 然后,您可以初始化它們指向適當的位置。 一個最小的例子是:

#define ON_CPU 5
#define ON_GPU 5

class Item {};

struct A {
    A() {
        m_Items[0] = 0; // initialize your array here
        m_ItemsOnCpu = &(m_Items[0]);
        m_ItemsOnGpu = &(m_Items[ON_CPU]);
    };
    Item * m_Items[ON_CPU + ON_GPU];
    Item * const * m_ItemsOnCpu;
    Item * const * m_ItemsOnGpu;
};

int main() {
}

我希望這有幫助。

暫無
暫無

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

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