扩展类和实例化

Extending classes and instantiation

本文关键字:实例化 扩展      更新时间:2023-10-16

假设我们有一个由两个类组成的RedBlack Tree实现:

  • Tree-保存指向树的Node *root的指针,并定义树上的所有操作(InsertDelete等)
  • Node-一个数据存储器,它保存指向Node *parentNode *leftNode *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
}

首先,我修复了糟糕的newdelete,并用智能指针替换了它。然后我还把你的树作为模板,因为谁需要一个只能做一种类型的树?然后我把你的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
}