Const指向指针数组的指针

时间:2013-09-03 14:38:42

标签: c++ pointers const

我有这个课程

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 指针。我如何声明然后初始化它们?

3 个答案:

答案 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() {
}

我希望这会有所帮助。