如何处理这样的任务。我实现了BST模板类,它能够对int
,float
等简单类型进行操作。现在我想实现另一个模板类Vector
并在BST中为此类型添加不同的功能模板类,因为Vector
类型的每个比较比较Vector长度而不仅仅是值(在这种情况下是两个值)。
#ifndef BSTTREE_BST_H
#define BSTTREE_BST_H
template <class T> class bst {
struct node {
T d;
node *l, *r;
};
node* root;
public:
bst();
~bst();
void freeMemory(node* bstNode);
void insert(T x);
void show();
void show(node* bstNode);
int count(node* bstNode);
node* search(T x);
node* search(node* bstNode, T x);
bool rmv(T x);
};
#include "bst.cpp"
#endif //BSTTREE_BST_H
#ifndef BSTTREE_BST_CPP
#define BSTTREE_BST_CPP
#include "bst.h"
#include <iostream>
template <class T>
bst<T>::bst() {}
template <class T>
bst<T>::~bst() {}
template <class T>
void bst<T>::freeMemory(bst::node *node) {}
template <class T>
void bst<T>::insert(T x){}
template <class T>
void bst<T>::show() {}
template <class T>
void bst<T>::show(node* root) {}
template <class T>
int bst<T>::count(node* root) {}
template <class T>
typename bst<T>::node* bst<T>::search(T x) {}
template <class T>
typename bst<T>::node* bst<T>::search(node* root, T x) {}
template <class T>
node* bst<T>::rmv(int value, node *parent) {}
#endif //BSTTREE_BST_CPP
我没有实现内部方法,因为它工作得很好而且不是任务。我知道这些代码中的一些内容是错误的,但我必须遵循一些规则,我认为这些规则并不是很聪明,但这不是重点。
我考虑在.h / .cpp文件中创建另一个模板类vector
,并在bst.cpp中包含Vector
类的标头,并仅为Vector
类模板写入其他功能。
这是个好主意吗?或者有更好的方法(如果可能的话,不会更改我的代码)。怎么做?
答案 0 :(得分:2)
C ++支持operator overloading,这意味着如果您坚持使用特定的比较运算符,例如*(root->l) < *(root->r)
,这将适用于原始类型int
,float
,等
同时您可以定义自定义
bool Vector::operator<(const Vector& other) const { return this->length() < other.length(); }
这样,在比较Vector
个实例时,BST模板类将正确调用指定的重载方法。
答案 1 :(得分:0)
不是为特定的vector
类添加功能,而是可以尝试创建一个重载函数,在其中比较2个值,并为该函数添加第三个参数,这将是一个函数指针,你可以在vector
课程中定义。
示例::
void func1(T v1, T v2, (bool) (*compare) (T, T));
(T
是模板类型)
您可以创建此compare
函数,该函数不仅可以比较长度,还可以根据具体情况比较其他一些属性,并在func1
中使用compare
返回的结果。