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가 아니라 아주 처음부터 잘못되었다는 것이 가능합니다. 여기에 어떤 의견이라도 대단히 감사하겠습니다.
답장을 보내 주셔서 감사합니다. 관계 연산자 함수 (< and >)의 Node 매개 변수를 템플릿 클래스로 바꾼 이유를 설명해 주시겠습니까? –
죄송합니다. 실수였습니다. 나는 그것을 고쳤다. – jrs