gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:49:20 28 4
gpt4 key购买 nike

我正在使用必须像这样调用的遗留 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com