【发布时间】:2021-01-28 13:24:16
【问题描述】:
我正在编写一个可以动态增长和收缩的 C++ 类数组容器。我想阻止此容器的用户获取其项目的地址,因为当容器需要重新分配自身时,它们可能会被重新分配。使用此容器的唯一正确方法是跟踪容器的地址和每个项目的索引(是的,我将在文档中指定它,但如果我可以让编译器触发会更好如果容器的用户尝试获取项目的地址,则会出错?
这可以以某种方式完成吗?我搜索并发现了一些关于将“操作员地址”设为私有的问题,但似乎不能保证它可以工作,也不是推荐的做法。所以,我想知道是否有任何替代技术可以防止访问指向项目的指针......
【问题讨论】:
-
不。 address-of 运算符的神秘重载将应用于容器中的类,而不是容器本身。如果容器中的对象没有重载它们的地址操作符,则容器对此无能为力。 C++ 不能以这种方式工作。
-
只要您返回对所包含项目的引用,用户就能够获得所述项目的地址。
-
正如其他人所提到的,除非您始终将副本返回到容器元素,否则实际上不可能实现它,但没有人会使用这样的容器。没有真正的好方法可以让每个人都满意来解决这个问题,您可以在元素被重定位并且指针失效时包含在文档中,或者您可以将元素保留在
std::shared_ptr中并按原样返回,但这会极大地影响性能。 -
我想阻止此容器的用户获取其项目的地址 -- 您可以通过在容器中放入文档来阻止用户:危险.取容器中元素的地址是有风险的。如果用户不想注意记录的内容,那么如果事情没有解决,那就是他们的错。
-
我建议阅读这个Q&A about iterator invalidation rules。 C++ 程序员习惯于指向容器中元素的指针和迭代器在某些操作下变得无效。通知用户何时以及哪些指针失效,这或多或少是你能做的。
标签: c++