2012-11-17 4 views
-2

필자의 메인 클래스에는 person 클래스가 있는데, 에는 Strategy 객체에 대한 포인터가 들어있다. 나는이 작업을 수행하기 위해 노력하고있어 :포인터가 초기화되지 않았습니까?

person.strategyPointer->getStrategyType() 

을하지만이 밖으로 인쇄 할 때, 나는 특별한 번호를, 3435973836.이 아마 내 strategyPointer가 초기화되지 않은 것을 의미한다.

Strategy* strategyPointer; 

그리고 Person.cpp 파일

내가 같이 포인터를 초기화 : 내 사람 클래스 헤더 파일에서

는,이 선언합니다. 내가 널 포인터를 가리키면

Person::Person() 
    : strategyPointer(nullptr) 
{ 
} 

, 왜 컴파일러는 아직도이 strategyPointer 초기화하지 않는 불평한다? 아니면 을 가리키고 있기 때문에 범위를 벗어나서 삭제됩니까? 나는 실제로 구문 분석 할 때 포인터를 가리킨다. 내가 상속을 사용하고

StrategyType newStrat; 
newStrat.setStrategyType(strategyType); 
    person.strategyPointer = &newStrat 

및 전략 내 기본 클래스입니다 : 나는 같은 것을 할. 그러나, 내 메인 소스 파일에서 나중에 초기화에 대해 불평합니다. 이 초기화 문제로 계속 진행됩니다. 내가 포인터 가짜 전략 개체 중 하나를 가리킬 수 없습니다.

EDIT : 나는 사람 헤더 파일에 새 변수 선언을 추가했습니다. 전략 newStrategy; 나중에 내가 만든 StrategyType 개체를 newStrategy에 할당하고 strategyPointer를 & newStrategy로 지정합니다. 이것은 내가 범위에서 벗어나서 만든 StrategyType 객체를 방지해야합니다. 맞습니까? 하지만 내 main.cpp에서 person.stratPointer-> getStrategyType();을 출력하려고 할 때 나는 여전히 같은 값을 얻습니다. 그러나 person.newStrategy.getStrategyType()을 출력하면 원하는 값을 얻을 수 있습니다.

+3

어떤 프로그래밍 언어처럼 대답합니까? –

+0

정확한 오류 메시지를 게시하십시오.컴파일러는 일반적으로 초기화되지 않은 변수에 대해 불평하지 않습니다. 일반적으로 런타임 문제입니다. – Barmar

+0

@EddieB 소스 파일의 이름이 Person.cpp라고 했으므로 C++ 태그를 추가했습니다. – Barmar

답변

1

NULL 포인터를 역 참조하려는 의도가 아니라면 (그리고 머리를 검사 할 때) "초기화 된"정의는 포인터를 nullptr의 초기화 자 목록에 설정하면 정확합니다. 사람 생성자는 그 값이 불확실한 것을 피한다.

즉,이 비명 소리 ??? 이 (그리고 확실히해야합니다) 순간 newStrat이 함수 반환, 루프 종료 등의 범위를 벗어나 어딘가 함수에있는 경우

StrategyType newStrat; 
newStrat.setStrategyType(strategyType); 
person.strategyPointer = &newStrat; 

, 당신의 person 객체는 현재 정의되지 않은 동작을 참조합니다. 또한 스택 마커가 결과 값으로 표시되는 이유를 설명합니다.

사람의 가치 특성 StrategyType을 확인하고 다음과 같이 초기화 :

person.strategy.setStrategyType(strategyType); 

을 더 나은 방법이 같은 :

class Person 
{ 
    ... 
    StrategyType strategy; 

public: 
    void setStrategyType(StrategyType type) 
    { 
     strategyType.setStrategyType(type); 
    } 
}; 
당신이 얻을 수 있도록 노력하겠습니다 경우 당신은 더 자세한 정보를 제공 할 수 있습니다
관련 문제