初始化const 3D数组成员变量

时间:2017-03-09 15:34:25

标签: c++ multidimensional-array

我想在班上创建一个常量(最好是静态的但不是必需的)成员变量 我希望它是一个三维数组,每个长度为2 目的:存储一些在每次更改时重新创建的数据,对于3种类型的布尔选择的组合,而不必对每次更改进行复杂的测试。

我不知道该怎么做:如何初始化3D阵列。

这就是我正在尝试的(基于cplusplus.com/forum/Multi-Dimensional Arrays):

class MyClass {
public: ...
    ~MyClass();   // will I need to destroy m_previewIcons to prevent memory leak ?
private: ...
    static const QIcon m_previewIcons[2][2][2];   // the array I need
    static QIcon*** initializePreviewIcons();     // what type of return ?
};

const QIcon MyClass::m_previewIcons[2][2][2] = MyClass::initializePreviewIcons();

QIcon ***MyClass ::initializePreviewIcons()
{
    QIcon ***iconArray = 0;

    // Allocate memory
    iconArray = new QIcon**[2];
    for (int i = 0; i < 2; ++i)
    {
        iconArray[i] = new QIcon*[2];
        for (int j = 0; j < 2; ++j)
            iconArray[i][j] = new QIcon[2];
            // is this even right ? it seems to me I miss out on a dimension ?
    }

    // Assign values
    iconArray[0][0][0] = QIcon(":/image1.png"); 
    iconArray[0][0][1] = QIcon(":/image2.png"); ...
    iconArray[1][1][1] = QIcon(":/image8.png");

    return iconArray;
}

据我所知......

error: conversion from 'QIcon***' to non-scalar type 'QIcon' requested

如何让这个初始化工作?

注意 - QIcon是Qt中的内置类,这是我使用的(任何类都是相同的)。
不过C ++ 11。

我本可以使用矢量,但我想减少开销。

编辑:我刚刚想到了另一种方法...放弃3D数组,使用简单的1D数组,并使用布尔位移位为索引构建一个int。可能更有效。
但我仍然想知道如何初始化3D数组。

2 个答案:

答案 0 :(得分:2)

您正在创建一个静态数组,然后尝试动态分配其内存,这是不必要的 - 凭借您的声明static const QIcon m_previewIcons[2][2][2];

,内存已经存在

您应该使用列表初始化来初始化您的3d数组,la this answer

以下是非POD类型的示例,std :: string:

#include <string>

class MyClass {
public:
     static const std::string m_previewIcons[2][2][2];
};

const std::string MyClass::m_previewIcons[2][2][2] = { 
                               { {":/image1.png",":/image2.png"},
                                 {":/image3.png",":/image4.png"} }, 
                               { {":/image5.png",":/image6.png"},
                                 {":/image7.png",":/image8.png"} } 
                            };
int main()
{
    MyClass mc;
    printf("%s\n", mc.m_previewIcons[0][0][0].c_str());
}

答案 1 :(得分:1)

问题是C ++没有提供类初始化:只有静态初始化器或实例构造器。

但是这里很简单,因为数组元素的构造很简单,所以你可以使用:

class MyClass {
public: ...
    ~MyClass();   // will I need to destroy m_previewIcons to prevent memory leak ?
private: ...
    static const QIcon m_previewIcons[2][2][2];   // the array I need
};

const QIcon MyClass::m_previewIcons[2][2][2] = {
    QIcon(":/image1.png"),
    QIcon(":/image2.png"),
    ...,
    QIcon(":/image8.png") };

由于m_previewIcons具有静态链接,因此其持续时间是整个程序,因此您既不为其提供存储也不释放它。换句话说,不要将它从析构函数中删除。