我正在尝试将静态指针初始化为类定义中的数组,但却会出现运行时错误。我已经看过类似的东西已经完成的例子,但是我无法让它工作,也不确定为什么。我尝试过的一些示例代码是:
class Header
{
private:
static int *pointer;
public:
int getVal(int val);
};
班级定义:
#include "Header.h"
int* Header::pointer = new int[] {0, 1, 2, 3, 4};
int Header::getVal(int val)
{
return pointer[val];
}
主:
#include "Header.h"
#include <iostream>
int main(int argc, char ** argv)
{
Header header;
for (int i = 0; i < 5; i++)
{
std::cout << header.getVal(i);
}
}
运行此命令会在初始化指针时导致错误。如果我在调试器中运行它,并忽略错误,我可以看到指针在开始时初始化为0。如果我继续单步执行它,我会收到另一个错误,说堆已损坏。是否有可能以这种方式对指针进行初始化?如果没有,是否有人建议如何将成员变量指针初始化为数组,并在类定义中为其赋值,而无需单独分配数组的每个元素。
答案 0 :(得分:4)
你可能会逃脱:
class Header
{
public:
int getVal(int valIndex);
};
然后
#include "Header.h"
static int s_vals[] = {0, 1, 2, 3, 4}; // could move this line to B
int Header::getVal(int valIndex)
{
// B
return s_vals[valIndex];
}
考虑到您在编译时知道数组的大小,并且如果您提供访问器,则无需公布实现细节。
答案 1 :(得分:0)
您的编译器可能不支持braced-init-list。 如果是这样,您可以通过以下方式重写您的课程
class Header
{
private:
static int *pointer;
static int *init()
{
int *p = new int[5];
std::iota( p, p + 5, 0 );
return ( p );
}
public:
int getVal(int val);
};
然后指针按以下方式定义
int * Header::pointer = Header::init();