1

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

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

4

2 回答 2

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

考虑到您在编译时知道数组的大小,并且如果您仍然提供访问器,则无需宣传实现细节。

于 2013-10-14T13:12:04.770 回答
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();
于 2013-10-14T13:14:29.563 回答