【问题标题】:Const pointer to an array of pointers指向指针数组的 const 指针
【发布时间】:2013-09-03 14:38:42
【问题描述】:

我有这门课

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 指向数组的两个部分的指针。我需要如何声明然后初始化它们?

【问题讨论】:

  • 为什么不创建返回这些指针的 GetCPUItems 和 GetGPUItems 函数?

标签: c++ pointers constants


【解决方案1】:

在 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;
};

【讨论】:

  • 只有静态常量整数数据成员可以在类中初始化
  • @Yola,不是根据clang;它只是警告“非静态数据成员的类内初始化是 C++11 扩展”。添加-std=c++11 使其消失。老实说,我对我的 C++ 并没有那么感兴趣。它是一个clang扩展吗?这不是警告听起来的样子。
  • 我使用 C++ 而不是 C++11 :)
  • ...但我的回答明确表示 C++11。
【解决方案2】:

所以你想要这样的东西:

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;
}

【讨论】:

    【解决方案3】:

    据我了解,您希望 m_ItemsOnCpu 指向 m_Items 的开头,而 m_ItemsOnGpu 位于 m_Items 中间的某个位置。

    我不知道你想通过指向 Item 指针来实现什么。您可以为此使用两个单独的 Item* 数组。如果它们需要在内存中是连续的,那么类或结构成员就会自动出现这种情况,尽管由于结构成员对齐,两者之间可能会有一个小的间隙,您可以在大多数编译器上将其设置为 1 个字节,i.e. MSVS。

    我认为您需要 const 指针,因此您的类的用户无法修改它们(指向 Item 的指针的 const 指针,Item ** const m_ItemsOnCpu)。这可以通过使用 getter 函数而不是公开暴露成员变量来实现。 const 对象需要初始化,不能赋值。由于 m_Items 的地址是在运行时确定的,所以我看不到初始化 const 指针的方法。

    另一个可能的目标是您不希望用户修改 m_ItemsOnCpu 和 m_ItemsOnCpu 指向的指针(指向 Item 的 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() {
    }
    

    我希望这会有所帮助。

    【讨论】:

    • 其实 Paul Evans 和 Carl Norum 的代码工作得很好,所以我错了不能初始化 m_ItemsOnCpu 和 m_ItemsOnGpu。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2012-08-04
    • 2021-12-08
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多