在类中初始化静态指针

时间:2013-10-14 13:02:36

标签: c++ pointers

我正在尝试将静态指针初始化为类定义中的数组,但却会出现运行时错误。我已经看过类似的东西已经完成的例子,但是我无法让它工作,也不确定为什么。我尝试过的一些示例代码是:

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。如果我继续单步执行它,我会收到另一个错误,说堆已损坏。是否有可能以这种方式对指针进行初始化?如果没有,是否有人建议如何将成员变量指针初始化为数组,并在类定义中为其赋值,而无需单独分配数组的每个元素。

2 个答案:

答案 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();