1)所以我做了一个有点修改的链表的形式,它有基于索引的寻址和其他删除功能。我要复制我制作的头文件......
template<class T>
class LinkedList
{
public:
LinkedList();
~LinkedList();
int del_node(); // deletes the Node and element
int remove_node(); // deletes the Node only
int get_length();
int search_node(T*); // matches the pointer to see if its the same element
void add(T*);
void clear_list(); // calls deletes on all nodes and all elements
bool is_blank();
T& get_at(int); // operates like a vector get_at
private:
struct Node
{
T* element; // pointer passed to add(T*) is stored here.
Node* next;
}
现在看看我如何在链表中添加对象。我需要传入一个对象指针,我以
的形式传递 new Object()
当我添加图表的顶点时,这尤其有用。我只是输入用户的数据和其他字段并调用
LinkedList graph
graph.add(new Vertex(arguments));
现在出现了一种情况,我必须将LinkedList
A
中的一些元素复制到B
以进行临时存储。现在我希望能够在任何操作后从B
中删除元素。但是如果我使用delete
它会破坏内部节点并删除传递给它的指针element
所指向的对象。所以我创建了一个额外的函数remove
,它只删除了节点,但没有删除element
指向的对象。
所以我想询问是否可以这样做或者我的列表中是否存在设计错误而我不应该这样做?我从库的角度考虑这个问题,例如我是否会在库中提供这个类。这适合或者会让人迷惑吗?任何建议将不胜感激。
请,我不需要任何建议来使用替代品 函数/类/库像向量。我正在研究数据结构,我有 我自己设计任何类型的数据结构。
答案 0 :(得分:1)
更为惯用的方式是让Node::~Node
始终致电delete element;
,但添加T* Node::release();
。这就是std::unique_ptr
所做的事情。
实施很简单:
T* Node::release()
{
T* tmp = element;
element = nullptr;
return tmp;
}
Node
d的方式仍然是正确的,但你可以&#34;保存&#34;来自删除的数据。
这也是解决我认为实施中存在缺陷的第一步。您实现LinkedList
中的所有功能,甚至是与内部类Node
的行为相关的功能。不要这样做。授予Node
角色和与该角色相关的界面。使用该界面使LinkedList
工作。
答案 1 :(得分:0)
在设计课程时,所有权应该是明确的。
为此,您可以使用显式方法名称,并在转移所有权时返回std::unique_ptr
。使用显式方法名称,您应该能够删除您的评论。
template<class T>
class LinkedList
{
public:
LinkedList(const LinkedList&);
LinkedList(LinkedList&&);
LinkedList& operator=(const LinkedList&);
LinkedList& operator=(LinkedList&&);
void free_element(int); // deletes the Node and element
std::unique_ptr<T> extract_element(int); // deletes the Node only
int get_length() const;
void add_element(std::unique_ptr<T>);
void absorb_element(T*);
void free_all_elements(); // calls deletes on all nodes and all elements
};