繁体   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