我有这两个 header
文件,List.h
和 ListTraits.h
List.h 继承自 ListTraits.h
,本意是模板类实现
std::list
。现在一切正常,但 insert()
方法实现。
我必须在 ListTraits.h
中使用 List.h
,而 std::list insert
方法返回
一个 iterator
,ListTraits.h
的 insert
方法签名很奇怪。这些是类:
列表.h
template <typename T>
class List: public ListTraits<T> {
protected:
std::list<T> list;
public:
unsigned int size() {return 0;}
ListTraits<T>& insert(const T& item) { //<----------I think I should be returning iterator, but I have to return something of ListTraits<T> and that doesnt make sense
typename std::list<T>::iterator it;
list.insert(list.end(), item);
return it;
}
const T* getCurrentElement() const {
}
...
和 ListTraits.h
#pragma once
//------------ Declarations for List traits used in Test1 in main.cpp
template <typename T> class ListTraits
{
public:
virtual unsigned int size() = 0;
virtual ListTraits& insert(const T& item) = 0; //<-----------------------INSERT METHOD HERE---#######
virtual void print() = 0;
};
//------------ Declarations for List traits used in Test2 in main.cpp
template <typename T> class ListTraitsExtended
{
public:
virtual const T* getCurrentElement() const = 0;
virtual void advance() = 0;
virtual void rewind() = 0;
};
能否请您帮我完成 insert
方法,使其成为标准库 list.insert(it, value)
方法的模板版本?
答案 0 :(得分:2)
改变
return it;
}
到
return *this;
}
这允许一种称为“方法链”的技术。
list.insert(a).insert(b).insert(c);
答案 1 :(得分:1)
有趣的是,如果您只需要在后面插入,我建议您更改
std::list<T> list;
到 std::vector<T> data;
然后通过 data.push_back(item);
我上面说的可能不是这样,咳咳,就你而言,因为你必须实施 方法如:
T* getCurrentElement();
void advance();
void rewind();
这可能意味着您必须保留一个指向“当前”元素的指针,以便在被询问时可以返回它,您还必须能够转到上一个元素或下一个元素,并且可能只插入在当前元素之后,而不是在最后插入。
例如,如果我们忽略这样一个事实,即这个赋值的整个想法是让你实现所谓的“双链表”(意味着你必须保留 HeadPtr、TailPtr 和 CurrentPtr 并相应地移动它们),可以通过在后面返回最后插入的元素并获取其地址来实现getCurrentElement。你不应该忘记检查是否有元素:
T* getCurrentElement()
{
T* result = nullptr;
if (!list.empty())
{
result = &list.back();
}
return result;
}
您真的应该检查一下 std::list 和 std::vector 中已经有哪些开箱即用的方法