나는 다양한 종류의 동물을 나타내는 많은 클래스가 있습니다. 아이디어는 같은 종의 두 동물이 만나면이 종의 새로운 동물이 만들어 져야한다는 것입니다. 이것은 제가이 상황에서 특정 클래스의 새로운 인텐스를 만들고 싶다는 것을 의미합니다. 곰이 만나면 새로운 곰 인스턴스를 만들고 싶습니다. 박쥐가 만날 때 새로운 박쥐 인스턴스를 만들고 싶습니다.
코드를 복제하지 않고 어떻게이 목표를 달성 할 수 있습니까? 각 클래스 (동물)에 대해 개별 if 조건을 만드는 것을 피하고 싶습니다. 기존 인스턴스의 클래스를 기반으로 클래스의 새 인스턴스가 자동으로 생성되는 솔루션을 찾고 있습니다.
두 부모 객체 가 동일한 유형을 가져야 한다는 것을 알고 있기 때문에 일반적인 이중 디스 패칭 솔루션이 필요하지 않습니다. 가능한 모든 조합을 처리하도록 만들어졌습니다.
복제 패턴의 약간 수정 된 변형을 사용하겠습니다. Animal
, 기본 클래스는 순수 가상 복제 기능을 얻습니다.
struct Animal {
virtual std::unique_ptr<Animal> mateWith(Animal const &other) const = 0;
};
그런 다음 모든 하위 클래스가이 메서드를 구현하여 RTTI를 통해 다른 Animal
것이 실제로 올바른 유형인지 확인합니다.
struct Bear : Animal {
std::unique_ptr<Animal> mateWith(Animal const &other) const override {
auto &otherBear = dynamic_cast<Bear const &>(other);
return std::make_unique<Bear>(*this, otherBear);
}
};
std::bad_cast
다른 동물이 곰이 아니면 던질 것 입니다. 이를 다른 오류 처리로 바꿀 수도 있습니다.
struct Bear : Animal {
std::unique_ptr<Animal> mateWith(Animal const &other) const override {
auto *otherBear = dynamic_cast<Bear const *>(&other);
if(!otherBear) {
// This is not a bear!
}
return std::make_unique<Bear>(*this, *otherBear);
}
};
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다