두 가지 메서드가있는 클래스가 있다고 가정합니다. 그들 중 하나는 컨테이너에서 객체를 찾아 값으로 반환해야하며 다른 객체는 참조로 반환해야합니다. 당연히 첫 번째 방법은 const
(this
의 의미는 const
)이고 두 번째 방법은 그렇지 않기를 바란다.C++에서 동일한 항목의 값과 참조를 반환하는 두 가지 메서드를 작성하는 최적의 방법
둘 다 의존하는 세 번째 방법을 도입하지 않고도이 두 가지 방법간에 코드를 재사용 할 수 있습니까? 아래에서는 문제의 장난감 예를 들었는데, find
단계가 실제로 훨씬 더 복잡하다고 상상해보십시오. "가능한 구현 1"의
아래 인해 I는 (const
) get_value
내에서 (비 const
) get_ref
부르고 있다는 사실에 에러가있다. "가능한 구현 2"에서 참조는 값의 임시 복사본으로 만들어지며 이는 물론 주요한 문제입니다.
const
참조가 필요한 경우 물론 문제는 없지만 실제로는 일반적인 참조를 원한다고 가정합니다.
// Header:
#include <string>
#include <map>
using std::string;
using std::map;
class Test {
public:
map< string, string > stuff;
string & get_ref(const string key);
string get_value(const string key) const;
};
// Possible implementation 1:
string Test::get_value(const string key) const {
return get_ref(key);
}
string & Test::get_ref(const string key) {
return stuff.find(key)->second;
}
// Possible implementation 2 (obviously wrong, but here for the sake of pointing that out):
string Test::get_value(const string key) const {
return stuff.find(key)->second;
}
string & Test::get_ref(const string key) {
return get_value(key);
}
두 번째 구현에서'get_ref'가 반환하는 것에 대해 조금 생각해보십시오. 실제로 컴파일러가 컴파일러에게 무엇을 말하려한다면? –
관련없는 노트에서, 키가 발견되지 않고'find' 함수가'end' 반복자를 리턴하면 어떻게되는지 생각해야합니다. –
@Someprogrammerdude 만약 당신이 임시의 반환을 암시하는, OP는 이미 두 번째 구현을 사용하지 않는 이유로 언급했다 –