Инициализация массива в классе в C ++ - PullRequest
1 голос
/ 24 марта 2011

Я пишу класс для стека из 4 элементов. Определяется так:

// HPStack.h
class HPStack{
public:
        HPStack();
        void push(int x);
        int  pop();
        int  peek();
private:
        int stack[];
};
 // HPStack.cpp
HPStack::HPStack(){
        int stack[4] = {0,0,0,0};
}
// push/pop functions
// ....
int HPStack::peek(){
        return stack[0];
}

Тогда я называю это:

int main(){
        HPStack* stack = new HPStack();
        cout << stack->peek() << endl;
        return 0;
}

Но когда я запускаю функцию main (скомпилированную с g ++), она выдает: 137048, когда я действительно хочу, чтобы она напечатала 0. Что здесь происходит и что я могу сделать, чтобы исправить проблему? *

Ответы [ 6 ]

5 голосов
/ 24 марта 2011
HPStack::HPStack(){
        int stack[4] = {0,0,0,0};
}

Здесь stack объявлено как локальная переменная. Если в вашем классе есть переменная-член, также называемая stack, то она не инициализируется и не отображается в конструкторе, поскольку она скрыта.

Если вы хотите инициализировать нулем массив элементов, вы можете value-initialize его, указав явный пустой инициализатор в списке инициализаторов элементов.

HPStack::HPStack() : stack()
{
}

Редактировать: Это недопустимое определение члена. Если у вас есть член массива, вы должны задать ему ненулевой размер:

private:
    int stack[];
1 голос
/ 24 марта 2011
 int stack[4] = {0,0,0,0};

является локальной переменной и выходит из области видимости после возврата конструктора. stack[] как переменная-член отличается от той, которая присутствует в конструкторе.

0 голосов
/ 24 марта 2011

В вашем конструкторе вы должны динамически распределять память для вашего массива.

stack = new int[4];

Или вы можете создать статический массив в своем определении класса

int stack[4];

PS: когда вы используете динамическийраспределение не забудьте освободить память в вашем деструкторе:

delete[] stack;
0 голосов
/ 24 марта 2011

Полагаю, у вас есть int stack[4] в качестве переменной-члена HPStack.Но в конструкторе вы делаете int stack[4] = {0,0,0,0};, дополнительная int здесь приводит к новой локальной переменной stack, которая скрывает исходную переменную-член.Поэтому, когда вы используете peek, переменная-член неинициализируется, и вы получаете значение мусора.Вам нужно исправить код инициализации, взгляните на метод std::fill, который может заполнить уже определенный массив заданным значением.

0 голосов
/ 24 марта 2011

В конструкторе HPStack вы инициализировали локальный массив вместо member-array, вы заметили?

0 голосов
/ 24 марта 2011
int stack[4] = {0,0,0,0};

Это создает локальную переменную стека - она ​​не изменяет вашу member переменную стека. Измените его на:

std::fill(stack, stack+4, 0);

Или просто:

for (int i = 0; i < 4; ++i) 
    stack[i] = 0;

Кроме того, ваша stack переменная-член должна быть объявлена ​​следующим образом:

int stack[4];

Обновленный код:

// HPStack.h
class HPStack{
public:
        HPStack();
        void push(int x);
        int  pop();
        int  peek();
private:
        int stack[4];
};
 // HPStack.cpp
HPStack::HPStack(){
        for (int i = 0; i < 4; ++i) 
            stack[i] = 0;
}
// push/pop functions
// ....
int HPStack::peek(){
        return stack[0];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...