【问题标题】:how to fix Error in initializing an array using a variable?如何修复使用变量初始化数组时的错误?
【发布时间】:2016-05-05 03:05:00
【问题描述】:

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

class stack {


 private:

const int maxsize;
int arrays[maxsize];
int top;

public:

stack();
void additem(int);
void print();
};

【问题讨论】:

  • C++ 不允许可变大小的数组。
  • 所以唯一的方法是作为数组[10]? 假设我希望 maxsize 为 10
  • 你可以在构造函数中使用arrays = new int[maxsize];的动态分配。
  • 你的构造函数没有参数。 maxsize 的值是从哪里得到的?
  • 我只是在构造函数中将值 10 分配给它。栈::栈{ maxsize = 10; }

标签: c++ arrays data-structures stack


【解决方案1】:

一个好的解决办法是:

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) {}
};

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

【讨论】:

    【解决方案2】:

    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();
    };
    

    How to initialize a const field in constructor?

    你还需要一个析构函数来执行delete[] arrays;

    但比起使用 C 风格的数组,您可能会发现使用std::vector&lt;int&gt; 更容易。这不需要首先指定最大长度,它会根据需要扩展。

    当然,您可以跳过整个练习并使用std::stack&lt;int&gt;

    【讨论】:

    • const 成员变量不是个好主意,它会干扰诸如存储在向量中的对象之类的事情
    【解决方案3】:

    如果您希望 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&lt;int&gt; 并完全摆脱maxsize。这使您不必进行任何手动内存管理。

    【讨论】:

      猜你喜欢
      • 2011-12-20
      • 1970-01-01
      • 2016-05-26
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      相关资源
      最近更新 更多