10

配列を使用してスタックを実装しようとしていますが、エラーが発生します。

class Stack{
private:
    int cap;
    int elements[this->cap]; // <--- Errors here
    int top;
public:
  Stack(){
     this->cap=5;
     this->top=-1;
};

示された行に次のエラーがあります。

Multiple markers at this line
- invalid use of 'this' at top level
- array bound is not an integer constant before ']' token

私は何を間違っていますか?

4

4 に答える 4

27

C++ では、配列のサイズはコンパイル時に既知の定数でなければなりません。そうでない場合は、エラーが発生します。

ここで、あなたは持っています

int elements[this->cap];

this->capの大きさに依存するため、コンパイル時に既知の定数ではないことに注意してくださいcap

サイズが後で決定される可変サイズの配列が必要な場合はstd::vector、実行時にサイズ変更できる の使用を検討してください。

お役に立てれば!

于 2013-05-08T20:14:10.313 に答える
2

thisそのような宣言で は使用できません。thisクラスの非静的メソッドに渡される定数ポインタです。その範囲外には存在しません。

このような配列宣言には、サイズの定数値/式が必要です。あなたはそれを望まず、動的にサイズ変更されたコンテナが必要です。解決策は、を使用することstd::vectorです。

于 2013-05-08T20:14:09.650 に答える
0

他の人がこの問題の原因をすでに説明しているので、解決するための可能な解決策は次のとおりです。コンパイル時に配列サイズがわからない可能性があり、割り当てによって使用が制限される可能性があるためstd::vector<int>、ポインター実装の使用を検討してください。

#include <algorithm>

class Stack{
private:
    int cap;
    int* elements; // use a pointer
    int top;
public:
    Stack(){
        this->cap=5;
        this->top=-1;
        elements = new int[this->cap];
    }

    Stack(const Stack& s) 
         : cap(s.cap) , top(s.top), elements(NULL)
    {
         if(cap > 0) {
             elements = new int[cap];
         }

         std::copy(s.elements , s.elements + cap, elements );
    }

    Stack& operator=(Stack s) {
         swap(s, *this);
         return  *this;
    }

    ~Stack() {delete [] elements;}

    friend void swap(Stack& first, Stack& second)
    {
        using std::swap; 
        swap(first.top, second.top);
        swap(first.cap, second.cap);
        swap(first.elements, second.elements);
    }
};
于 2013-05-08T20:24:53.813 に答える
0

変化する

int elements[this->cap];

int* elements=new int[cap]
于 2016-04-02T13:35:33.553 に答える