[英]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.