2

我有这门课

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

4

3 回答 3

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;
};
于 2013-09-03T14:43:16.027 回答
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;
}
于 2013-09-03T14:45:25.760 回答
0

据我了解,您希望 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() {
}

我希望这有帮助。

于 2013-09-03T15:43:18.767 回答