c++ - C++迭代器的设计

标签 c++ c++11

我正在使用必须像这样调用的遗留 API:

Iterator iter = IteratorCreate();
while (iter)
{
    Object obj = IteratorGet(iter);

    //do stuff

    IteratorNext(iter);
}
IteratorDelete(iter);

我想知道我是否可以将它包装到 C++ 迭代器中,所以在谷歌搜索了一下后我发现我可以构建这样的东西:

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_;
};

这似乎有点工作,但我想知道是否有更好的方法。此外,在调试时我看到了一些“奇怪”的东西,构造函数被调用了 2 次,但析构函数被调用了 4 次:

0000006B27633D98 enhanced 0000006B22DFF858
0000000000000000 default 0000006B22DFF868

0000000000000000 0000006B22DFF8C8
0000006B267FE510 0000006B22DFF898
0000000000000000 0000006B22DFF868
0000006B267FE510 0000006B22DFF858

这是为什么?

最佳答案

这是零违规的基本规则。发生这种情况是因为您没有重新使用标准库中正确执行此工作的资源处理组件,而是编写了自己的错误资源处理。

一个简单的例子是如果迭代器被复制会发生什么,标准要求它必须能够处理。

您应该根据标准库原语实现几乎所有资源处理。一个简单的共享指针可以轻松解决这个问题。

关于c++ - C++迭代器的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32617678/

相关文章:

c++ - 关闭 Eclipse 错误(不是真正的错误)

c++ - Auto 和 Void 的区别?

c++ - 没有 Boost.System 的 Boost.Asio

c++ - 给定相同的索引,是否保证 iword() 和 pword() 引用不同的基础值?

c++ - openCV 中的 KalmanFilter Tracking - 程序接收信号 SIGSEGV

c++ - 堆叠协程 + gdb = "previous frame inner to this frame (corrupt stack)?"

c++ - 线程数组并试图将多个参数传递给函数不起作用?

c++ - 临时初始化和引用初始化

c++ - 对基类中的重载函数的调用不明确

c++ - 在不窃取焦点的情况下使用对话框控件