2013-04-10 3 views
1

아래 함수를 사용하여 my_type 벡터를 검색합니다. 현재 컴파일 경고가 있습니다 : control reaches end of non-void function [-Wreturn-type]. 포인터가 아닌 반환 유형으로 참조를 사용하는 한 null과 같은 값을 반환 할 수 없습니다. 내가 널 같은 값을 반환 내 반환 형식이 아닌 포인터로 참조를, 그것이 가능하지 않습니다 사용하고 같은void가 아닌 함수에서 돌아 오는 방법은 무엇입니까?

struct my_type{ 
    type_a a; 
    type_b b; 
} 

    type_b& value(type_a& t){ 
     typename std::vector<my_type>::iterator it; 
     for(it = v.begin(); it != v.end(); ++it){ 
      if ((*it).a == t) return (*it).b; 
      } 
    } 
+1

참고 문헌이 null이 될 수 없다. – Mankarse

+1

컨테이너의 요소 (멤버)에 대한 참조를 반환하는 것은 어쨌든 좋은 생각이 아닙니다. – Beta

+0

''for''가 끝날 때''return something_meaningfull''을 추가하십시오. – gongzhitaao

답변

3

그것은 한 것으로 나타납니다?

글쎄, 그래,하지만 그게 유일한 문제는 아니야. 참조가 null 일 수는 없지만 if 문이 true으로 평가되지 않으면 어떻게됩니까? 을 반환하지 않습니다..

참조는 null 일 수 없으므로 null을 반환하는 것은 유효하지 않습니다. 모든 실행 경로에서 유효한 참조를 반환해야합니다.

또한 코드는 기껏해야 깨지기 쉽습니다. 컨테이너의 요소 멤버에 대한 참조를 반환하는 중입니다. 미래에 언제든지 이동할 수있는 요소로 인해 해당 참조가 유효하지 않게됩니다.

1

당신이 생각해야 할 질문은 함수가 my_type을 반환해야하는 경우 '아무것도'가없는 경우 무엇을 반환해야하는지입니다. 이것을 어떻게 다루는가는 호출자가이 함수와 가정을 사용하는 방법에 직접적인 영향을 미칩니다.

생각할 수있는 몇 가지 아이디어가 있습니다. 예를 들어, value 함수가 포인터 유형을 반환 한 경우 아무 것도 나타내지 않고 NULL을 반환 할 수 있습니다. 문자열을 반환 한 경우 빈 문자열 ""을 사용하거나 "none"과 같은 특수 문자열 값을 사용하여이를 나타낼 수 있습니다. type_b의 경우 특수 인스턴스를 생성하고 인스턴스를 반환하여 아무것도 표시하지 않을 수 있습니다. 이 함수를 호출하는 다른 함수는 반환 된 type_b을 해당 인스턴스와 비교하여 아무 것도 없는지 확인합니다. 요점은, 그것에 대해 갈 수있는 많은 방법들이 있으며, 당신이 선택하는 방법은 당신에게 달려 있다는 것입니다.

하지만 더 나은 방법은 이미 stl에서 제공 한 것, 특히 std::find_if을 사용하는 것입니다. 예를 들어, 일치있을 때 지정하는 펑터를 만들 수 있습니다

struct find_b 
{ 
    const type_a &this_a; 
    find_b(const type_a &a) : this_a(a) {} 
    bool operator() (const my_type &lhs) 
    { 
    return lhs.a == this_a; 
    } 
}; 

그런 다음 당신은 다음과 같이 사용합니다 :

item = std::find_if(v.begin(), v.end(), find_b(t)); 
if(item == v.end()) { /* not found */ } 
else { /* found, do something useful here */ } 
관련 문제