我想在班上创建一个常量(最好是静态的但不是必需的)成员变量 我希望它是一个三维数组,每个长度为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数组。
答案 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
具有静态链接,因此其持续时间是整个程序,因此您既不为其提供存储也不释放它。换句话说,不要将它从析构函数中删除。