我有这个课程
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 指针。我如何声明然后初始化它们?
答案 0 :(得分:5)
在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;
};
答案 1 :(得分:5)
所以你想要这样的东西:
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;
}
答案 2 :(得分:0)
据我了解,你想在m_Items的开头有m_ItemsOnCpu点,在m_Items的中间某处有m_ItemsOnGpu。
通过指向Item指针,我不知道你想要实现什么。您可以使用两个单独的Item *数组。如果它们需要在内存中连续,那么类或结构成员自动就是这种情况,尽管由于结构成员对齐可能会有一个小的间隙,在大多数编译器上你可以设置为1个字节,{{3} }。
我想你想要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() {
}
我希望这会有所帮助。