如何修复使用变量初始化数组时出错

how to fix Error in initializing an array using a variable?

本文关键字:数组 出错 初始化 变量 何修复      更新时间:2023-10-16

我正在尝试使用数组实现堆栈。这就是我在我的头文件。我计划在构造函数中将值分配给 maxsize。但是,我不断收到错误。我该如何解决这个问题?

class stack {

 private:
const int maxsize;
int arrays[maxsize];
int top;
public:
stack();
void additem(int);
void print();
};

一个好的解决方法是:

class stack
{
    std::vector<int> arrays;
    int top;
public:
    stack(int maxsize) : arrays(maxsize), top(0) {}
};

这样,您就没有任何内存管理错误的可能性;您的类在复制、移动、交换等时行为正常,并且您的代码非常简单。

具有最小内存占用的替代方法是:

class stack
{
    std::unique_ptr<int[]> arrays;
    int maxsize;
    int top;
public:
    stack(int maxsize) : arrays(new int[maxsize]), maxsize(maxsize), top(0) {}
};

这个版本是可移动的,但在复制时会出现编译错误(与使用原始指针的其他一些建议相反,原始指针将成功编译,然后在运行时导致内存损坏)。 要使此类可复制,您需要编写自己的复制构造函数和复制赋值运算符。

C++不允许

可变长度数组。您可以使用指针和动态分配代替数组。

要初始化 const 成员,您必须在构造函数的初始值设定项列表中执行此操作。

class stack {
private:
    const int maxsize;
    int *arrays;
    int top;
public:
    stack(int max = 10) : maxsize(max) {
        arrays = new int[max];
        top = 0;
    }
    void additem(int);
    void print();
};

请参阅如何在构造函数中初始化常量字段?

然后,您还需要一个执行delete[] arrays;的析构函数。

但是,与其使用 C 样式数组,您可能会发现使用 std::vector<int> 更容易。这不需要首先指定最大长度,它将根据需要扩展。

当然,您可以跳过整个练习并使用std::stack<int>

如果你想让maxsize总是10,你可以做这样的事情:

class stack {
private:
    static const int maxsize = 10;
    int arrays[maxsize];
...

请注意,我已经将maxsize设为静态。 对于 stack 的所有实例,它都是相同的,并且在编译时定义。 因此,您可以将其用作数组大小。

如果您希望maxsize是可变的,则需要使用动态分配:

class stack {
private:
    const int maxsize;
    int* arrays;
    ...
public:
    stack(int maxsize) : maxsize(maxsize), arrays(0) {
        arrays = new int[maxsize];
    }
    ~stack() { delete[] arrays; }
    ...

请注意,此处必须删除动态分配的内存。 通常执行此操作的地方是析构函数。 如果你想走这条路,你也可以使用std::vector<int>并完全摆脱maxsize。 这使您不必进行任何手动内存管理。