Programing

검색 결과를 찾을 수없는 경우 "NULL"개체를 반환합니다.

lottogame 2020. 9. 3. 23:36
반응형

검색 결과를 찾을 수없는 경우 "NULL"개체를 반환합니다.


저는 C ++를 처음 접하기 때문에 배우는 동안 많은 Java-ism으로 디자인하는 경향이 있습니다. 어쨌든 Java에서 특정 매개 변수와 일치 하는 개체 T반환하는 'search'메서드가있는 클래스가 Collection< T >있으면 해당 개체를 반환하고 컬렉션에서 개체를 찾을 수 없으면 null. 그런 다음 내 호출 함수에서if(tResult != null) { ... }

C ++ null에서 객체가 존재하지 않으면 값을 반환 할 수 없다는 것을 알게되었습니다 . 호출 함수에 개체가 없음을 알리는 T 유형의 '인디케이터'를 반환하고 싶습니다. 정말 예외적 인 상황이 아니기 때문에 예외를 던지고 싶지 않습니다.

지금 내 코드는 다음과 같습니다.

class Node {
    Attr& getAttribute(const string& attribute_name) const {
       //search collection
       //if found at i
            return attributes[i];
       //if not found
            return NULL; // what should this be?
    }

private:
    vector<Attr> attributes;
}

그런 종류의 마커를 줄 수 있도록 어떻게 변경할 수 있습니까?


C ++에서 참조는 null 일 수 없습니다. 아무것도 발견되지 않은 경우 선택적으로 null을 반환하려면 참조가 아닌 포인터를 반환해야합니다.

Attr *getAttribute(const string& attribute_name) const {
   //search collection
   //if found at i
        return &attributes[i];
   //if not found
        return nullptr;
}

그렇지 않고 참조로 반환을 고집하면 속성을 찾을 수 없으면 예외를 throw해야합니다.

(덧붙여서, 당신의 메서드가 constconst속성을 반환하는 것에 대해 약간 걱정 됩니다. 철학적 인 이유로를 반환하는 것이 좋습니다 const Attr *.이 속성을 수정하려는 경우에도 비 const메서드로 오버로드 할 수 있습니다. const속성도 반환합니다 .)


여기에 몇 가지 가능한 답변이 있습니다. 존재할 수있는 것을 반환하고 싶습니다. 다음은 가장 선호하지 않는 것부터 가장 선호하는 것까지 몇 가지 옵션입니다.

  • 참조로 반환하고 예외로 찾을 수 없음 신호를 보냅니다.

    Attr& getAttribute(const string& attribute_name) const 
    {
       //search collection
       //if found at i
            return attributes[i];
       //if not found
            throw no_such_attribute_error;
    }

속성을 찾지 못하는 것은 실행의 정상적인 부분이므로 예외는 아닙니다. 이에 대한 처리는 시끄 럽습니다. null 참조를 갖는 것은 정의되지 않은 동작이므로 null 값을 반환 할 수 없습니다.

  • 포인터로 반환

    Attr* getAttribute(const string& attribute_name) const 
    {
       //search collection
       //if found at i
            return &attributes[i];
       //if not found
            return nullptr;
    }

getAttribute의 결과가 NULL이 아닌 포인터인지 확인하는 것은 잊기 쉽고 버그의 쉬운 원인입니다.

  • Boost를 사용하십시오 .

    boost::optional<Attr&> getAttribute(const string& attribute_name) const 
    {
       //search collection
       //if found at i
            return attributes[i];
       //if not found
            return boost::optional<Attr&>();
    }

boost :: optional은 여기서 무슨 일이 일어나고 있는지 정확하게 나타내며 그러한 속성이 발견되었는지 여부를 검사하는 쉬운 방법을 가지고 있습니다.


참고 : std :: optional은 최근 C ++ 17에 투표되었으므로 가까운 장래에 "표준"이 될 것입니다.


NULL 반환을 나타내는 정적 개체를 쉽게 만들 수 있습니다.

class Attr;
extern Attr AttrNull;

class Node { 
.... 

Attr& getAttribute(const string& attribute_name) const { 
   //search collection 
   //if found at i 
        return attributes[i]; 
   //if not found 
        return AttrNull; 
} 

bool IsNull(const Attr& test) const {
    return &test == &AttrNull;
}

 private: 
   vector<Attr> attributes; 
};

그리고 소스 파일 어딘가에 :

static Attr AttrNull;

If you want a NULL return value you need to use pointers instead of references.

References can't themselves be NULL.

(Note to the future comment posters: Yes you can have the address of a reference be NULL if you really really try to).

See my answer here for a list of differences between references and pointers.


As you have figured out that you cannot do it the way you have done in Java (or C#). Here is another suggestion, you could pass in the reference of the object as an argument and return bool value. If the result is found in your collection, you could assign it to the reference being passed and return ‘true’, otherwise return ‘false’. Please consider this code.

typedef std::map<string, Operator> OPERATORS_MAP;

bool OperatorList::tryGetOperator(string token, Operator& op)
{
    bool val = false;

    OPERATORS_MAP::iterator it = m_operators.find(token);
    if (it != m_operators.end())
    {
        op = it->second;
        val = true;
    }
    return val;
}

The function above has to find the Operator against the key 'token', if it finds the one it returns true and assign the value to parameter Operator& op.

The caller code for this routine looks like this

Operator opr;
if (OperatorList::tryGetOperator(strOperator, opr))
{
    //Do something here if true is returned.
}

The reason that you can't return NULL here is because you've declared your return type as Attr&. The trailing & makes the return value a "reference", which is basically a guaranteed-not-to-be-null pointer to an existing object. If you want to be able to return null, change Attr& to Attr*.


You are unable to return NULL because the return type of the function is an object reference and not a pointer.


You can try this:

return &Type();

참고URL : https://stackoverflow.com/questions/2639255/return-a-null-object-if-search-result-not-found

반응형