扩展类和实例化
Extending classes and instantiation
假设我们有一个由两个类组成的RedBlack Tree实现:
Tree
-保存指向树的Node *root
的指针,并定义树上的所有操作(Insert
、Delete
等)Node
-一个数据存储器,它保存指向Node *parent
、Node *left
、Node *right
节点和std::string key
的指针
Tree::Insert()
具有以下实现:
void Tree::Insert(const std::string &key)
{
Node *z = new Node(key);
// adding node logic
}
现在的任务是:每个节点都必须存储创建时间。
限制:应该尽可能少地修改基树实现,并且应该包含特定扩展的详细信息(因此它应该对创建时间属性一无所知)。
我的想法是:扩展NodeWithTime : Node
并添加unsigned int creation_time
属性。
我陷入了困境:我们现在该如何实例化节点?
有什么建议吗?
附言:这既不是家庭作业,也不是工作任务——我只是在学习c++和数据结构。
它相对简单。首先,节点结构:
template<typename T> struct Node {
Node(T t) : value(std::move(t)), time(RightNow()) {}
T value;
TimeType time;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
};
快速助手make_unique
:
template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args...)));
}
template<typename T> void Tree<T>::Insert(T key) {
auto z = make_unique<Node<T>>(std::move(key));
// insert
}
首先,我修复了糟糕的new
和delete
,并用智能指针替换了它。然后我还把你的树作为模板,因为谁需要一个只能做一种类型的树?然后我把你的const T&
换成了T
,这样它就可以使用只移动类型了。
然后我添加了一个时间字段,并在构造函数中调用RightNow()。您使用的确切TimeType和RightNow()取决于您的需求以及您所说的"创建时间"的确切含义。我们说的是"2013年7月6日"吗?还是一个非常高分辨率的时钟?在任何情况下,这些"创建时间"细节都不会影响树。
编辑:等等,你想有一个只有一些节点知道创建时间的树类型吗?或者只是为了更改树,以便所有节点都知道创建时间?我做了#2,但对于#1,您确实可以简单地从Node继承。也就是说,
template<typename T> struct Node {
Node(T t) : value(std::move(t)) {}
T value;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
};
template<typename T> struct NodeWithTime : Node<T> {
TimeType time;
NodeWithTime(T t) : Node(std::move(t)), time(RightNow()) {}
};
template<typename T> void Tree<T>::insert(T t) {
std::unique_ptr<Node> nodeptr;
if (IWantToStoreCreationTime)
nodeptr = make_unique<NodeWithTime<T>>(std::move(t));
else
nodeptr = make_unique<Node>(std::move(t));
// insert
}
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- [temp.variadic]中关于包扩展实例化的措辞
- 如何在代码中创建抽象类,让蓝图扩展它,并将该蓝图返回给代码进行实例化?
- 如何在PHP扩展中实例化全局C++类
- 首先是模板实例化与宏扩展
- 扩展类和实例化