2014-12-15 1 views
-1

허프만 코딩 용 CodeTree를 작성하고 있습니다.노드 유형의 다형성. 가장 좋은 솔루션은 무엇입니까?

class Node 
{ 
protected: 
    enum TYPE{INTERNAL,LEAF}; 
public: 
    virtual TYPE is() = 0; 
}; 
class InternalNode : public Node{ 
    TYPE is(){ 
     return Node::INTERNAL; 
    } 
    ...other methods 
}; 
class LeafNode: public Node{ 
    TYPE is(){ 
     return Node::LEAF; 
    } 
    ...other methods 
}; 

그것은 잘 작동하지만 나는 그것이 좋은 디자인인지 모르거나하지, 내가 좋아하는 뭔가를 들었다 : "기본 객체는 하위 유형의 지식이 없습니다.".
Node 클래스의 모든 것을 병합하는 것이 좋으며, 두 클래스로 분리하는 것이 더 낫습니다.

+1

여기에는 다형성에 대한 강력한 사례가 없습니다. 당신은 고전적인 대수 데이터 타입을 가지고 있습니다. 하나의 클래스를 사용하십시오. 내부에는 태그가있는 공용체가있을 수 있습니다. –

답변

1
당신은 실제 개체의 유형을 결정
enum TYPE{INTERNAL,LEAF}; 

을 사용하는

. 간접적으로 당신은 방금 virtual function mechanism이 (가) 대체하는 것을 구현하고 있습니다.

어쨌든 런타임에 개체의 실제 유형을 결정하는 것 외에 다른 옵션이 없다면 더 나은 방법이 있습니다. 당신이 사용할 수있는 것처럼 dynamic_cast 또는 type_info

+0

그러나 dynamic_cast 또는 type_info의 사용은 잘못된 디자인의 징후입니다. 맞습니까? – user2477

+0

그래서 "다른 옵션이 없다면"이라고 말한 것입니다. – ravi

+0

유형은 이진 트리에서 이동하는 데 사용됩니다 (예 : 내부 노드 인 경우 childLeft 및 childRight로 이동하고 그렇지 않으면 리프로, return ...). 그래서 유형 검사가 알고리즘 자체에서가 아니라 알고리즘을 사용한다고 말하면 "가상 함수 메커니즘"이 여기에 적용되지 않습니다. – user2477

1

나는 런타임에서 포인터의 실제 타입을 검사 할 필요가 있다고 가정한다. 이 경우 typeid을 사용하면 정확한 포인터의 유형을 결정하는 데 사용할 수있는 type_info 개체를 반환 할 수 있습니다.

if(Derived * derived = dynamic_cast< Derived * >(pointer)) 
    derived->someMethod(); 
1

당신은 충분히 코드를 제공하지 : 객체를 캐스팅하고 그것의 방법 중 몇 가지를 호출해야하는 경우

if(typeid(pointer) == typeid(derived)) 
    ///derived 
else 
... 

직접 dynamic_cast을 사용할 수 있습니다 (다형성을 가정하는 것은 해결책이 아니다) 확인하기. 그것은 런타임에 노드의 유형을 판별하는 f}이있는 이유에 따라 다 (니다.

Node 클래스 자체에서 유형을 검사하고 유형에 따라 Node 클래스에서 다르게 동작하는 경우 불리한 분리가 발생하므로 설계를 다시 생각해 봐야합니다.

클래스의 사용자가 가리키는 Node 객체의 유형을 찾을 수 있도록 is() 함수를 제공하면 다른 답변에서 언급했듯이 대신 typeid와 같은 내장 함수를 사용할 수 있습니다.

+0

유형은 이진 트리에서 이동하는 데 사용됩니다 (예 : 내부 노드 인 경우 childLeft 및 childRight로 이동하고, 그렇지 않으면 리프로, return ...). 그래서 타입 검사는 알고리즘 자체가 아니라 그것을 사용하여 사용된다고 말할 수 있습니다. – user2477

관련 문제