2011-03-24 11 views
1

4 개의 요소가있는 스택에 대한 클래스를 작성하고 있습니다. 다음과 같이 정의 :C++ 클래스의 배열 초기화

// 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을 인쇄 할 때. 여기서 무슨 일이 일어나고 있으며 문제를 해결하기 위해 무엇을 할 수 있습니까?

+0

당신의 ctor가 완료되면 ctor의 local []이 없어 지므로 쓰레기가있는 int int stack [] 클래스가 남아 있습니다. – snoofkin

답변

5
HPStack::HPStack(){ 
     int stack[4] = {0,0,0,0}; 
} 

여기에서 stack은 로컬 변수로 선언됩니다. 클래스에 stack이라고도하는 멤버 변수가 있으면이 클래스는 초기화되지 않고 생성자에서 숨겨져 있으므로 볼 수 없습니다.

구성원 배열을 0으로 초기화하려는 경우 값 초기화에 멤버 초기화 자 목록에 명시 적으로 비어있는 초기화자를 지정하여 값을 초기화 할 수 있습니다.

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

편집 :이 잘못된 멤버 정의입니다. 배열 구성원이있는 경우 0이 아닌 크기를 지정해야합니다.

private: 
    int stack[]; 
0
int stack[4] = {0,0,0,0}; 

이것은 지역 스택 변수를 생성 - 당신의 회원 스택 변수를 수정 아니에요. 단순히

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]; 
} 
0

HP의 생성자에서 Stack을 사용하면 멤버 배열 대신 로컬 배열을 초기화했습니다.

+0

HPStack.cpp : 생성자 'HPStack :: HPStack()': HPStack.cpp : 8 : 오류 : '{'토큰 앞에 예상 기본 표현 HPStack.cpp : 8 : 오류 : 예상 된'; ' before '{'토큰 –

+0

코드는 배열의 네 번째 요소가 {0, 0, 0, 0}이어야 함을 의미합니다.) – Dmitry

+0

그건 실수 였고, 내가 알아 차린대로 고쳐졌습니다. –

1
int stack[4] = {0,0,0,0}; 

은 로컬 변수이며 생성자가 반환하면 범위를 벗어납니다. 구성원 변수로 stack[]은 생성자에있는 변수와 다릅니다.

0

을 회원 변수 HPStack으로 가정합니다. 그러나 생성자에서 int stack[4] = {0,0,0,0};을 수행하고 있고 여기에 여분의 int을 입력하면 로컬 변수 stack이 원래 멤버 변수를 숨 깁니다. 따라서 peek을 사용하면 멤버 변수가 초기화되지 않고 가비지 값을 얻습니다. 초기화 코드를 수정해야하며 이미 정의 된 배열을 주어진 값으로 채울 수있는 std::fill 메소드를 살펴보십시오.

0

생성자에서 배열에 동적으로 메모리를 할당해야합니다.

stack = new int[4]; 

또는 당신은 당신의 클래스 정의에 정적 배열을 만들 수 있습니다

int stack[4]; 

PS : 당신은 당신의 소멸자에서 메모리를 해제하는 것을 잊지 마세요 동적 할당을 사용하는 경우 :

delete[] stack; 
+0

나는 규칙이 malloc-free, new-delete라고 생각했다. – p4553d

+0

물론 그렇습니다! – Dmitry