我有这门课
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_ItemsOnCpu 点位于 m_Items 的开头,而 m_ItemsOnGpu 位于 m_Items 中间的某个位置。
我不知道你想通过指向 Item 指针来实现什么。您可以为此使用两个单独的 Item* 数组。如果它们需要在内存中是连续的,那么类或结构成员就会自动出现这种情况,尽管由于结构成员对齐,在大多数编译器(即 MSVS )上您可以将其设置为 1 字节,但在它们之间可能会有一个小的间隙。
我认为您需要 const 指针,因此您的类的用户无法修改它们(指向 Item 的指针的 const 指针Item ** const m_ItemsOnCpu
)。这可以通过使用 getter 函数而不是公开暴露成员变量来实现。const 对象需要初始化,不能赋值。由于 m_Items 的地址是在运行时确定的,因此我看不到初始化 const 指针的方法。
另一个可能的目标是您不希望用户修改 m_ItemsOnCpu 和 m_ItemsOnCpu 指向的指针(指向 const 指向 Item 的指针的指针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() {
}
我希望这有帮助。