Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+的设计+;迭代器_C++_C++11 - Fatal编程技术网

C++ C+的设计+;迭代器

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

我使用的是一个遗留API,必须按如下方式调用:

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呢?