2011-03-15 4 views
2

다음과 같이 create 메소드가 있습니다.이 메소드는 return (null 포인터 인 경우)에서 오류를 가져 오려고합니다. 그러나 나는이 오류 처리 옵션이며, 함수 호출에 대한 요구 사항 싶지 않아. 선택적 오류 처리

코드 : 그래서

class foo { 
    foo() {...}; 
public: 
    ~foo(); 
    static foo* createFoo(int aparam = 42, int bparam = 10, int& error = ?) { 
     afoo* = new foo(); 
     if (!afoo) { 
      error = 11; 
      return 0; //NULL 
     } 
     ... 
     return afoo; 
    } 

} 

내가 다음 중 하나를 사용하기로 결정 할 수 있습니다 (내 실제 코드에서)이 시점에서

foo* myfoo = createFoo(42); 
if (!myfoo) { ... } 

또는

int errorcode = 0; 
foo* myfoo = createFoo(42, 10, errorcode); 
... 

, 내가 그냥 null 포인터 (ref 대신)를 사용하고 오류를주기 전에 createFoo 코드에서 유효성을 확인하는 것입니다.

내 생각에에 대한 모범 사례에 관심이 있습니다.

+0

비록 내가 ur 질문을 잘 이해하지 못했지만, 나는 솔루션이 오류없이 버전으로 ur 함수를 오버로드하는 것에 있다고 생각한다. – AbiusX

+0

@AbiusX 이것이 최선의 대안이라고 생각합니다. 다른 의견을 찾고 있습니다. – dcousens

+1

'afoo'는 _never_ null이 될 것입니다. 'new'는 할당이 실패하면'std :: bad_alloc'을 던지고 실패하면'foo'의 생성자가 예외를 던집니다. –

답변

1

나는 가장 좋은 방법을 제공 할 수 있다는 것을 알고 있지만, 여기 내 관점하지 않습니다.

NULL (확인되지 ​​않은 할당)을 검사하는 것은 C 및 C++의 표준 방식이며 잘 이해되고 쉽게 인식 할 수 있습니다. 선택적인 오류 코드를 추가하는 것은 융통성을 제공함에도 틀림없이 불필요한 복잡성을 추가합니다. 발신자가 매개 변수 사용 여부를 결정하는 것은 부담이됩니다.

이 해당 위치에서에 실패 할 가능성이 있다고 생각하지 않는 한 매개 변수를 사용하는 이유는 무엇입니까? 어떻게

만약 당신이 오류 코드가 중요하다고 생각한다면. 나는 당신이 항상 리턴 코드를 확인함으로써 대체 서명을 제안하고, 반환 된 포인터의 값을 확인하지 않는다 : 이것은 아마도 덜 편리한 기능입니다

// Returns error code. 
static int createFoo(int, int, Foo **); 

을하지만,에 발신자 (사용자)를 유도합니다 바른 길.

또는 std :: bad_alloc이 발생했는지 확인하거나 적절한 오류 코드를 사용하여 예외를 생성하는 예외를 사용할 수 있습니다. 가장 깨끗한 서명 인 것 같습니다.

struct fooException { int error; } 

// Throws fooException if cannot create foo. 
static foo * createFoo(int, int); 

나는 운전의 철학이 복잡합니다. 이 경우에는 외부 옵션 인 것으로 보이는 것을 제거하십시오. 오류 코드 중 하나가 중요하며 은 항상이어야하며 그렇지 않으면 항상 무시됩니다.

1

참조로 항목을 전달하면 해당 함수의 사용자에게 필수 매개 변수임을 알리는 것입니다. 오류 코드를 선택적으로 만들려면 int에 대한 포인터를 전달하고 기본값을 null로 설정하십시오.

static foo* createFoo(int aparam = 42, int bparam = 10, int* error = NULL) 
+0

나는 이것을 이해하고 현재이 솔루션을 사용하고 있다고 지적했다. – dcousens

+0

나는 그 선의 의미를 오해했습니다. 나는 createFoo를 호출 한 후 aFoo를 검사한다고 언급 한 것으로 생각했습니다. 제 의견으로는 이것이 최선의 방법입니다. – Nathanael