매우 불행하게도 2 단계 초기화를 사용하는 class
이 있습니다. 이 건설 된 후 초기화 메소드가 호출되지 않는 한, 개체가 여전히 사용할 준비가 없다는 것을 의미 :함수 내부에서 함수 반환 유형을 유추하십시오.
class A
{
public:
A();
bool init();
private:
bool m_is_initialized;
};
이 정책을 따라야한다 클래스의 다른 모든 방법 : 방법이 때 클래스를 호출하는 경우 가 아직 초기화되지 않은 경우 메서드는 클래스 특정 채널에서 실행을 중지하고 오류를 기록해야합니다.
일부 메서드는 반환 형식이 있습니다. 이 경우 정책은 반환 값 형식의 기본 생성 값을 반환하는 것입니다.
아이디어는, 같은 모든 메소드 구현의 시작 부분에서 호출 할 수있는 쉬운 매크로를 가지고하는 것입니다,
#define CHECK_INITIALIZED \
if (!m_is_initialized) \
{ \
LOG_E(m_channel, "%s object not initialized.", __PRETTY_FUNCTION__); \
assert(false); \
return; \
}
return
문, 그런데 만 void
기능 유효하며, 모든 경우에 맞지 않습니다. 매크로가 확장 된 함수의 반환 유형 T
을 유추 할 수있는 방법이 있습니까? T()
을 반환하고 매크로를 모든 곳에서 사용할 수있게 만들 수 있습니까?
편집 : 프로젝트 제한으로 인해 예외는 유감스럽게 사용할 수 없습니다.
값 초기화 된 반환 값이 유효하지 않습니다. 일반적으로 일부 유형은 기본 구성 가능하지 않으며 다른 유형은 유효한 리턴 값입니다. 예를 들어, 함수는 성공한 반환 값으로 0 또는 ""등을 반환 할 수 있습니다. – chris
'return' 대신'throw'를 쓰지 않는 이유는 무엇입니까? – NathanOliver
@chris 로깅이 발생하는 한 우리는 그걸로 충분합니다. – nyarlathotep108