2013-08-07 2 views
1

C++에 대한 깊은 이해를 돕기 위해 많은 Directed Graph 도우미 함수가있는 프로그램을 작성하고 있습니다. 중앙 개체 중 하나는 노드라고하며 노드 간의 이동 거리를 계산하는 데 도움이되는 멤버 함수가 있습니다. OOP 디자인에서 C++ 템플릿을 사용하는 것에 대한 더 나은 이해를 얻으려고합니다.템플릿 구현을 사용하는 C++ 지향 그래프 노드

는 여기에 내가 더 많은 기능을 포함하는이 클래스를 구축으로

class Node { 

    friend void swap(Node & first, Node & second) { 
     using std::swap; 
     swap(first.name, second.name); 
    } 

public: 

    Node(std::string val); 

    Node(const Node & copy); 

    Node & operator = (Node copy) { 

     swap(*this, copy); 
     return *this; 

    } 

    bool operator < (Node & rhs) const { 
     return (size < rhs.size); 
    } 

    bool operator > (Node & rhs) const { 
     return (size > rhs.size); 
    } 

    bool insertEdge(Node * dest, int distToNode); 

    // I'd like for this return type to not be tied to an int 
    // Especially if weights were represented as floats or doubles 
    int findTravelDistance(Node * const & toNode) const; 
    int findTravelDistance(std::queue<Node *> * const & nodeRoute) const; 

    // Mutators 
    void setNodeName(const std::string nameToSet); 
    std::string getNodeName() const; 

    void setNodeSize(const int size); 
    int getNodeSize() const; 

    // Misc 
    void toString() const; 

    // Constants 
    static const bool ALLOW_CIRCULAR; 

    ~Node(); 

protected: 


private: 
    int size; 
    std::string name; 
    // Here int represents the weight of the edge. I would like it to be able to be 
    // declared as an int, float, long, or double etc... 
    std::map<Node *, int> * travelEdges; 

}; // end class 

} // end namespace 

, 나는 나 자신이 내 기능 적응력 만드는 방법과 사투를 벌인 찾을 노드 클래스의 빠른 스냅 샷입니다. 예를 들어 findTravelDistance 함수를 살펴보십시오.

내가 원하는 것은 가중치를 나타내는 리턴 유형을 유형에 구애받지 않고 정렬 된 맵 데이터 구조의 값을 유형 불가지 론자로 지정하는 것입니다. 현재 구현되어 있으므로 사용자는 가중치에 대해 int 유형 만 선언 할 수 있습니다. 나는 함수 오버로딩을 착수 할 수 있음을 깨달았다. 그러나 나는 이것이 너무 중복되어 DRY 원칙에 명백한 위반이 될 것이라고 생각합니다. 이 기능의 작동 방식을 변경해야한다면 모든 과부하에 대해 변경해야합니다. 그래서 내 직감은 C++ 템플릿을 사용해야한다고 말합니다. 나는 템플릿을 처음 사용하기 때문에 어디서 선언해야할지 고심하고있다. 내가 발견 기능 템플릿 기능을하고 있다면 그냥 일반적인 형식을 반환 ..이 내 문제를 해결할

template<class T> 
T findTravelDistance(std::queue<Node *> * const & nodeRoute) const; 

합니다. 그러나 에지를 나타내는 기본지도 데이터 구조가 int를 보유 할 수만있는 문제는 해결되지 않습니다. 내 생각은 클래스 템플릿을 선언하는 것이 었습니다.

template<class T> 
class Node { ... } 

그러나 이것은 나에게도 이상한 것처럼 보였습니다. 이것은 에지 가중치를 나타내는 플로트 식으로 나는 것하지 즉시 동료 노드, 내 프로그램의 사용자 인 경우 선언과 초기화가

Node<float> * n = new Node<float>("N"); 

과 같을 것이라는 점을 의미 할 것입니다.

이 경우 템플릿을 가장 적절하게 또는 어떻게 적절하게 사용합니까? 아니면 올바른 경로라도 템플릿을 사용하고 있습니까? 내 수업 설계가 C++ 'esk가 아니라 아주 처음부터 잘못되었다는 것이 가능합니다. 여기에 어떤 의견이라도 대단히 감사하겠습니다.

답변

1

이것은 매우 깨끗한 코드입니다. :) C++에 오신 것을 환영합니다!

나는 당신이 원하는 것은 가중치를 유지하기 위해 템플릿 변수를 사용하는 것이라고 생각합니다. 다음과 같은 경우는 어떻습니까?

보너스로 사용 선언을 클래스 상단으로 옮겼습니다. 일반적으로 파일의 맨 위에 있습니다. Parashift C++ FAQ, 특히 section on const correctness과 같은 거룩한 성구를 보면서 유익을 얻을 수도 있습니다. 예를 들어, 비교 자 메소드에는 const 노드 & 매개 변수가 있어야합니다.

+0

답장을 보내 주셔서 감사합니다. 관계 연산자 함수 (< and >)의 Node 매개 변수를 템플릿 클래스로 바꾼 이유를 설명해 주시겠습니까? –

+0

죄송합니다. 실수였습니다. 나는 그것을 고쳤다. – jrs

관련 문제