2011-11-25 2 views
1

메소드에 문자열로 전달 된 이름에 해당하는 버스를 가져 오기 위해 다음 메소드를 구현하려고합니다. 여기서 AbstractBus는 버스의 기능을 포함하는 추상 클래스입니다. localBusses는 사람이 여기에 잘못이고 내가 그것을 어떻게 해결할 수 있는지 설명 할 수, 나는 오류 "아니오 연산자"= "이 피연산자 일치"를 받고 오전 표준 : :지도 그러나지도에서 추상 클래스 객체를 추상 클래스 참조로 저장

void getLocalBusByName(string& name, AbstractBus& bus) 
{ 
    bus = localBusses.find(name)->second; 
} 

입니까?

+0

가 오류를 게시 할 수

그래서 당신의 라인 getLocalBusByName 방법을 작성해야 귀하의 컴파일러에 의해보고 된대로? – hmjd

+1

localBusses는 AbstractBus 또는 AbstractBus * (AbstractBus에 대한 포인터)에 대한 문자열 맵입니까? – kbyrd

+0

'localBusses'의 정확한 선언을 게시하십시오. –

답변

1

코드가 제시 몇 가지 문제

  1. localBusses.find (...) 아무튼 # t는
  2. 당신은 발견에 대한 참조를 반환 할 것 버스를 찾을 때이 사건을 처리하지 않습니다 버스. 참조는 별칭이며 선언 된 경우에만 바인딩 할 수 있으며 이후에는 변경할 수 없음을 기억해야합니다. 즉, 다른 오브젝트에 대한 참조를 다시 바인드 할 수 없습니다.
  3. 2 다음에, bus = ...는 할당 연산자를 호출하여 찾은 버스를 참조에 의해 참조 된 버스에 지정하려고 시도합니다. 할당 연산자가 없거나 액세스 할 수 없습니다. 이 문맥에서 할당 연산자를 사용하는 것은 좋지 않은 아이디어이며, AbstractBus 클래스가 인스턴스화 (비 - 추상화) 될 경우 아마 슬라이스로 이어질 것입니다.

편집 :

typedef std::map<string, AbstractBus*> tBussesMap; 
tBussesMap localBusses; 

또는 AbstractBus은 어느 경우

나는 그러나 가정 (그 이름에도 불구하고) (모든 순수 방법을 포함하지 않는) 정말 추상적되지 않습니다 : 난 당신이 중 하나가 믿습니다 AbstractBus에서 파생 된 클래스가 있습니다. 그리고 getLocalBusByName은 버스가 발견되지 않는 상황을 대비해야하며 부주의 한 실수를 피하십시오. localBusses 유형의 것으로 간주됩니다

AbstractBus* 
getLocalBusByName(const string& name) 
{ 
    tBussesMap::iterator it = localBusses.find(name); 

    if (it != localBusses.end()) 
    { 
     return it->second; 
    } 

    return nullptr; 
} 

: std::map<string, AbstractBus*>은 (AbstractBus 추상적 경우에만 가능한 방법)

+0

당신의 도움을 많이 주셔서 감사합니다 –

+0

@sufyan siddique 당신은 wellcomed입니다 – ds27680