저는 C++에 비교적 익숙하지 않습니다. 이제는 다운 캐스팅을 피할 수없는 디자인의 한 부분에 직면 해 있습니다. 나는 이것이 일반적으로 나쁜 디자인의 징표라는 것을 알고 있습니다. 그래서 이것을하기위한 더 좋은 방법이 무엇인지 알고 싶습니다. 나는 동적 특성을 다루는 몇 가지 기능을 추가하는 새로운 Frame
서브 클래스, MechanicalFrame
를 만들기 위해 지금 할상속 된 트리 클래스에서 다운 캐스팅을 피하십시오
class Frame
{
private:
Frame *_parent;
std::vector<Frame*> _children;
public:
Frame* getParent() const;
std::vector<Frame*> getChildren() const;
... (extra methods for geometrical transformations)
}
:
나는 그들 사이에 기하학적 변환을 기하학적 프레임 나무를 나타내며 할 수있는 클래스 Frame
있습니다.
class MechanicalFrame
{
private:
double mass;
...
public:
void compute();
}
내 문제는 "컴퓨팅"방법은 몇 가지 재귀 논리를 구현해야한다는 것입니다, 그래서는 다음과 같이 포함됩니다 : getChildren
이 Frame*
및하지의 vector
를 반환하기 때문에, 그러나
MechanicalFrame::compute()
{
for element in getChildren():
element.compute();
}
을 MechanicalFrame*
,이 시점에서 static_cast
을 작성해야합니다. 나는 문제를 생각을 많이 부여했지만, 내가 찾은 솔루션 아무도 나에게 완벽하게 만족되지 않습니다 :
해결 방법 1) 정적 캐스트 : 어떻게 든 나쁜 디자인
솔루션 2)를 추가 표시 (Frame
)을 더미 구현으로, 즉 예외를 던지면서 메소드를 계산할 때 파생 클래스를 기반으로 부모 클래스의 구현을 강제하는 것은 부 자연스럽게 보입니다.
해결 방법 3) Frame
에서 전체적으로 MechanicalFrame
으로 분할하십시오. 이는 이미 Frame
에서 사용할 수있는 많은 기능을 다시 구현해야 함을 의미합니다.
도움이 될 것입니다. 사전에 많은 감사합니다 :)
기본 클래스에'Frame :: compute()'를 만들고 가상으로 만듭니다. 질문은 - 기본 클래스를 인스턴스화 할 예정입니까? 아마도'Frame'을 추상 클래스로 만드는 것이 좋은 생각 일 것입니다. – pSoLT
'MechanicalFrame :: getChildren()'에있는'Frame *'포인터가 모두'MechanicalFrame' 인스턴스를 가리키고 있다는 것을 확신한다면'static_cast'에 아무런 문제가 없습니다. 디버그 빌드 **에서'dynamic_cast' +'assert'를 사용하여 실수를 잡으십시오. –
@VittorioRomeo 정말 못 생겼습니다. – pSoLT