2016-11-27 1 views
1

작업을 수행해야하는 장치가 있습니다. 하나의 기본 클래스 BASE과 하위 클래스 TYPE1이 있습니다. 각 기기는 TYPE1의 인스턴스입니다. 이것들은 XML 구성 파일에있는 내용에 따라 다른 클래스에 의해 인스턴스화됩니다.std :: unordered_map에서 다른 유형의 클래스에 포인터를 저장합니다.

std::unordered_map <std::string, TYPE1 *> myDevices; 

또한 구성 파일에 사용되는 식별 키 인 std::string과 :

class BASE { 
public: 
    BASE(); 
    virtual ~BASE(); 
}; 

class TYPE1 : public BASE { 
public: 
    TYPE1(); 
}; 

는 지금은로 정의 된 std::unordered_map에서 이러한 인스턴스에 대한 포인터를 저장합니다.

std::unordered_map

은 내게 장치의 순서는 중요하지

for (auto& elem : myDevices) { 
    //do stuff 
} 

를 사용하여 반복하면 내가 모든 장치에서 동일한 작업을 수행 할 수있는 편리 성을 필요로하는 경우 객체에 빠르게 직접 액세스 할 수 있습니다 따라서 std::unordered_map입니다. 코드 전체에서 광범위하게 사용합니다.

이제는 BASE의 자식이지만 역시 다른 유형 인 TYPE2이 필요합니다.

내가

을 수정하려면 어떻게 그렇게 받아들이 :

내 질문은 동일한 결과

을하지만, 얻을 - 그들은 다른 기능을 -

TYPE1TYPE2 모두 동일한 방법을 실시해야 모든 유형의 수업은

std::unordered_map <std::string, acceptAnyTypeOfClass *> myDevices; 
와 같습니다.

나는 이것으로 막혔고, 나는 주변에서 벗어날 수 있다고 생각하는 동안 아주 빨리 추악해질 것이고 나는 그것을 깨끗한 방법으로하고 싶다. 나는 무엇을 요구하고 있는가? 그렇다면 어떻게해야 하는가?

+2

'std :: unordered_map '? –

+5

'std :: unordered_map >'을 사용하십시오. – ArchbishopOfBanterbury

+0

@Arch는 올바른 길 위에 있습니다. –

답변

2

TYPE1TYPE2 객체가 모든 BASE 객체이기 때문에, 기본 클래스에 대한 포인터를 사용하는 것이 마음에 오는 첫 번째 옵션 :

std::unordered_map <std::string, BASE*> myDevices; 

질문은 다음 호 세계 무역기구 (WTO)가 TYPE1*을 차이를 만들 것입니다이 포인터와 TYPE2* 포인터? 의 진정한 유형에 대한 걱정없이

class BASE { 
public: 
    BASE(); 
    virtual void doSomething()=0; 
    virtual ~BASE(); 
}; 

class TYPE1 : public BASE { 
public: 
    TYPE1(); 
    void doSometing() override { /* the code for TYPE 1 devices*/ } 
}; 

class TYPE2 : public BASE { 
public: 
    TYPE2(); 
    void doSometing() override { /* the code for TYPE 2 devices*/ } 
}; 

그런 다음 함수를 호출 할 수 있습니다

TYPE1으로

TYPE2 모두 같은 방법을 실시해야 가장 좋은 방법은 아마도 가상 함수를 사용하여, 다형성을 사용하는 것입니다 기본 대상 :

std::unordered_map <std::string, BASE*> myDevices; 
... 
for (auto& elem : myDevices) { 
    elem->doSomething(); 
} 

S : 장치 개체를 동적으로 만드는 경우 메모리 누출을 방지하기 위해 맵에서 고유 포인터 또는 공유 포인터를 사용하는 것이 좋습니다.

+0

좋아요, 다음 주에 가서 알려 드리겠습니다. 나는 약간의 구조 조정을 할 것이다. 그 동안 시간을내어 명확한 답을 주셔서 감사합니다. 내가 일하러 간 후에 당신의 대답을 받아 들일 것입니다. 동적으로 객체를 만들지 만 valgrind를 통해 실행하면 깨끗하게 나옵니다. 팁 고마워. 다음에 목록을 배울 필요가 있습니다. – ZoOl007

+0

@ ZoO007 :'std :: unique_ptr'은 메모리 누수를 피할뿐만 아니라 많은 정의되지 않은 동작 (예 : 두 번 삭제,'nullptr '등등)을 포함하여 수동 메모리 관리와 관련된 모든 종류의 불쾌한 오류를 피할 수 있습니다. –

+0

@Christophe 나는 당신이 나에게 말한 것에 따라 그것을 적응시킬 수 있었다. 아직 끝나면 type2를 테스트 할 수는 없지만 모양에서 보면 정상적으로 작동합니다. 시간 내 주셔서 대단히 감사합니다. – ZoOl007

관련 문제