我已经浏览了同一主题的一些主题,但它们确实像set和all一样先进。对于那些只是在C ++中找到自己脚步的人来说,处理这个问题的最佳方法是什么?
以下代码给出了错误:
class AStack {
public:
AStack(int size) : max_Size(size) {
}
void push(int);
int pop();
int top();
bool isEmpty();
void Flush();
private:
const int max_Size;
int a[max_Size];
int index = -1; // Index of the top most element
};
答案 0 :(得分:3)
这里有3个选项。
resize()
方法。static const uint32_t max_depth = 42;
(在课堂上初始化),然后您也可以使用该max_depth作为数组a
的大小。解决方案1看起来像这样:
template <size_t max_depth>
class AStack
{
// ...
int a[max_depth];
};
解决方案2然后看起来像这样:
#include <vector>
class AStack
{
public:
AStack( size_t max_depth )
{
a.resize(max_depth);
// ...
}
// ...
std::vector<int> a;
// ...
};
解决方案3看起来像这样:
class AStack
{
static const int max_depth = 42;
int a[max_depth];
// ...
};
固定大小的c数组只能用常量数组大小表达式声明 构造函数会影响类的非静态成员。类的静态const成员被“硬编码”初始化。
因此,如果您希望允许该类的用户使用不同的堆栈大小,则需要选项1或选项2.如果要对类中的堆栈大小进行硬编码,请使用选项3.选项2可以也可以使用operator new()或new()而不是std :: vector“手动”完成。但是你需要输入更多东西来检查,你很可能会有一些不会给教练留下深刻印象的错误;)
答案 1 :(得分:0)
显然这是一项学习练习,因此std::vector
的直接解决方案对您无效。这意味着你需要使用指针和动态分配。
将数组声明为指针:
int * a;
在构造函数中,分配适当大小的数组:
AStack(int size) : max_Size(size), a(new int[size])
无论何时分配内存,都需要在完成内存后释放内存。在这种情况下,在析构函数中。
~AStack() {
delete [] a;
}
因为析构函数不再是微不足道的,rule of three表明你也需要一个复制构造函数和赋值运算符。我会把那部分留给你。