2015-04-19 3 views
1
class Stack 
{    
private: 

    int tos; 
    const int max = 10;  
    int a[max]; 
public: 

    void push(int adddata); 
    void pop(); 
    void printlist(); 
}; 

ошибка: неправильное использование нестатического элемента данных «Макс»ошибка: неправильное использование нестатического элемента данных

что не так в коде, и, пожалуйста, помогите мне с правильной коррекцией. Thankyou

ответ

4

Обязательно, чтобы размер массива был известен во время компиляции для распределения без кучи (не используя new для распределения памяти).

Если вы используете C++ 11, constexpr - это хорошее ключевое слово, которое специально предназначено для этой цели.

constexpr int max = 10; 

Если вы не имеющие C++ 11 все же, использовать static, чтобы сделать это во время компиляции постоянной, как другие указали.

1

Как компилятор говорит сделать элемент данных статического

static const int max = 10;  
0

Вам нужно сделать Максу компиляции постоянная времени:

static const int max = 10; 
+0

Не все компиляторы поддерживают, что он должен быть 'статическими Const ИНТ макс,' в заголовке и 'сопзЬ Int Stack :: max = 10; 'в файле cpp – tejas

+0

@tejashs: определение' max' должно появиться и в заголовке. – Hurkyl

+0

Если у вас есть плохой/старый компилятор, вы также можете пойти и сделать 'inline static const int max() {return 10; } ' –

2

Как говорит ошибка, не более не является статичным член Stack; поэтому вы можете получить доступ к нему только как часть объекта Stack. Вы пытаетесь получить к нему доступ, как если бы это был статический член, который существует независимо от любых объектов.

Следовательно, вам необходимо сделать его статическим.

static const int max = 10; 

Если инициализация находится в файле заголовка затем каждый файл, который включает в себя заголовочный файл будет иметь определение статического члена. Таким образом, во время фазы ссылки вы получите ошибки компоновщика, поскольку код для инициализации переменной будет определен в нескольких исходных файлах.

1

Концептуальная ошибка, которую вы делаете, заключается в том, что вы пытаетесь инициализировать значения класса в определении класса. Именно поэтому существуют конструкторы. Используя параметризованный конструктор, задайте значения вершины стека и его размер. При создании объекта стека передать размер стека должен быть создан:

class Stack {    
private: 
    int tos; 
    int a[max]; 

public: 
    Stack(int s); 
    void push(int adddata); 
    void pop(); 
    void printlist(); 
}; 

Stack::Stack(int s) { 
    tos=-1; 
    max=s; 
} 
Смежные вопросы