提供成员数组的大小(const)作为构造函数参数RELOADED

时间:2015-03-05 02:50:58

标签: c++

我已经浏览了同一主题的一些主题,但它们确实像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
};

2 个答案:

答案 0 :(得分:3)

这里有3个选项。

  1. 将类转换为模板,深度参数成为模板参数。然后它是常量,你可以创建各自大小的数组。
  2. 对内部数组使用std :: vector并使用resize()方法。
  3. 将max_depth设为static const uint32_t max_depth = 42;(在课堂上初始化),然后您也可以使用该max_depth作为数组a的大小。
  4. 解决方案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表明你也需要一个复制构造函数和赋值运算符。我会把那部分留给你。