修改同一类型(但不同对象)公共方法中对象的私有指针



我一直在尝试创建一个模拟图上节点的节点类。当前,前置节点和后续节点的存储是通过节点指针向量std::vector<Node*> previous来存储的。前置节点/后续节点的向量是私有变量,可以通过setters/getter访问。

目前,我正在处理添加新节点时更新指针值的问题。我目前更新前任/继任节点的方法是通过这种方法(继任/前任节点的方法相同,只是名称更改(:

void set_next(std::vector<Node*> new_next) {
this->next.clear();
for (Node* node : new_next) {
this->next.push_back(node);
}
}

这适用于当前节点,但我想知道更新传入的new_next节点的最佳方法,尤其是最"C++"风格的方法。我之前写过一种方法,将单个节点添加到后继/前置向量中:

void add_next(Node* new_node, bool one_way = false) {
this->next.pushback(new_node);
if (!one_way) {
new_node->add_prev(this, one_way = true);
}
}

one_way变量用于确定add_next((调用的深度(?(。如果为true,它将添加到new_node的后继集,然后添加到前置集。由于当new_node->add_next((方法调用时,它只会添加到前置集合中,而不会尝试再次调用add_next/add_prev((。这个解决方案确实有效,但我不希望有one_way变量,并且希望该方法是私有的。

以下是当前类的结构:

class Node {
private:
std::vector<Node*> previous;
std::vector<Node*> next;
boost::any data;
public:
std::vector<Node*> get_previous()
void set_previous(std::vector<Node*> new_previous)

std::vector<Node*> get_next()
void set_next(std::vector<Node*> new_next)
void add_prev(Node* new_node, bool one_way = false)
void add_next(Node* new_node, bool one_way = false)
}

为了避免one_way参数,我的最佳解决方案似乎是创建一个add_next/add_prev方法,它只更新当前节点,而不更新传递的节点,这与上面的解决方案不同。有了这个解决方案,当添加新节点时,我可以在新节点上调用add_next/add_prev的倒数。然而,我有一个暗示,可能有一个更好的解决方案。

谢谢!

我认为这应该会让你开始(边缘情况留给你来解决,如果有的话(:

template<typename T>
class Node {
// Everything made public for debugging purposes, change this to fit your needs
public:
std::vector<Node<T>*> previous;
std::vector<Node<T>*> next;
T data;
Node(T val) {
data = val;
}
void set_next(std::vector<Node<T>*>& new_next);
};
template<typename T>
void Node<T>::set_next(std::vector<Node<T>*>& new_next) {
next = new_next;
for (Node<T>* node : new_next)
node->previous.push_back(this);
}

int main() {
// Little proof of concept where 0 is parent to 1, 2, 3
Node<int> one = 1;
Node<int> two = 2;
Node<int> three = 3;
Node<int> zero = 0;
std::vector<Node<int>*> new_next = { &one , &two, &three };
zero.set_next(new_next);
return 0;
}

总结差异:

  • 使用模板,boost::any是非标准的,对于这个任务来说非常糟糕
  • 利用运算符(=复制std::vector(
  • 利用引用类型(通过这种方式,您可以修改传递给函数的参数(

最新更新