C++ C+的设计+;迭代器
我使用的是一个遗留API,必须按如下方式调用:C++ C+的设计+;迭代器,c++,c++11,C++,C++11,我使用的是一个遗留API,必须按如下方式调用: Iterator iter = IteratorCreate(); while (iter) { Object obj = IteratorGet(iter); //do stuff IteratorNext(iter); } IteratorDelete(iter); class MyIterator { public: MyIterator(int id) { m_iter = It
Iterator iter = IteratorCreate();
while (iter)
{
Object obj = IteratorGet(iter);
//do stuff
IteratorNext(iter);
}
IteratorDelete(iter);
class MyIterator {
public:
MyIterator(int id)
{
m_iter = IteratorCreate();
m_obj = IteratorGet(m_iter);
std::cout << m_obj << " enhanced " << this << std::endl;
}
MyIterator()
{
std::cout << m_obj << " default " << this << std::endl;
}
bool operator!=(const MyIterator& other)
{
return (m_obj != other.m_obj);
}
const MyIterator& operator++()
{
IteratorNext(m_iter);
m_obj = IteratorGet(m_iter);
return *this;
}
CNeoPersist* operator*()
{
if (m_iter)
return m_obj;
else
return nullptr;
}
~MyIterator()
{
std::cout << m_iter << " " << this << std::endl;
}
private:
CIterator* m_iter = nullptr;
CNeoPersist* m_obj = nullptr;
};
class MyContainer
{
public:
MyIterator begin() const { return begin_; }
MyIterator end() const { return end_; }
MyContainer(int id) : begin_(id), end_() {}
private:
MyIterator begin_;
MyIterator end_;
};
我想知道我是否可以把它打包成C++迭代器,所以在搜索了一点之后,我发现我可以构建这样的东西:
Iterator iter = IteratorCreate();
while (iter)
{
Object obj = IteratorGet(iter);
//do stuff
IteratorNext(iter);
}
IteratorDelete(iter);
class MyIterator {
public:
MyIterator(int id)
{
m_iter = IteratorCreate();
m_obj = IteratorGet(m_iter);
std::cout << m_obj << " enhanced " << this << std::endl;
}
MyIterator()
{
std::cout << m_obj << " default " << this << std::endl;
}
bool operator!=(const MyIterator& other)
{
return (m_obj != other.m_obj);
}
const MyIterator& operator++()
{
IteratorNext(m_iter);
m_obj = IteratorGet(m_iter);
return *this;
}
CNeoPersist* operator*()
{
if (m_iter)
return m_obj;
else
return nullptr;
}
~MyIterator()
{
std::cout << m_iter << " " << this << std::endl;
}
private:
CIterator* m_iter = nullptr;
CNeoPersist* m_obj = nullptr;
};
class MyContainer
{
public:
MyIterator begin() const { return begin_; }
MyIterator end() const { return end_; }
MyContainer(int id) : begin_(id), end_() {}
private:
MyIterator begin_;
MyIterator end_;
};
为什么会这样?这是零违规的基本规则。之所以发生这种情况,是因为您没有重新使用标准库中正确执行此任务的资源处理组件,而是编写了自己不正确的资源处理 一个简单的例子是复制迭代器时会发生什么,标准要求它必须能够处理
您应该根据标准库原语实现几乎所有的资源处理。一个简单的共享指针可以解决这个问题。零冲突的基本规则。如果使用复制构造函数复制它们,则可能会导致差异。“wierd”位是因为缺少新迭代器类的复制构造函数和赋值运算符。阅读规则三和规则零如果包装的容器可以包含重复的元素,
operator=
错误。end_uu对象的状态不应该与begin_uu对象不同吗?迭代器可能不是指针,因此不适合作为shared_uptr的参数。不需要是指针。最坏的情况是,你可以共享\u ptr
@Puppy那么你会如何包装这个API呢?