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

时间:2016-01-27 22:48:32

标签: c++ arrays data-structures stack

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

class stack {


 private:

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

public:

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

3 个答案:

答案 0 :(得分: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) {}
};

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

答案 1 :(得分:0)

C ++不允许使用可变长度数组。您可以使用指针和动态分配来代替数组。

要初始化import sys def get_lined_input(): buffer = [] for line in sys.stdin: buffer.append(line) return ' '.join(buffer) 成员,您必须在构造函数的初始化列表中执行此操作。

const

请参阅How to initialize a const field in constructor?

然后您还需要一个执行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风格的数组。这不需要首先指定最大长度,它将根据需要进行扩展。

当然,您可以跳过整个exersize并使用std::vector<int>

答案 2 :(得分:0)

如果您希望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。这使您无需进行任何手动内存管理。