复杂数据结构的重载[] C ++运算符

时间:2015-12-03 09:08:32

标签: c++ indexing operator-overloading

我打算做什么:我有自己的容器结构。但是它不应该存储所有元素,而只应存储具有特殊属性的元素,而其他元素可以根据结构中的信息动态创建。

因此,我有一个插入(ITEM * i)方法,它检查我是否需要显式存储然后存储到地图中,或者可以动态重建它。然后只存储添加项目的信息。

对于ITEM * get(ITEMINDEX idx)方法也是如此。它检查是否明确存储属于idx的ITEM。如果是,则从内部映射读取并返回指针。如果已注册但隐式存储,则动态创建ITEM并返回。

为了与代码中的其他结构兼容,我计划重载[]运算符,但我不知道如何处理这个问题,或者这对于这个更复杂的结构是否可行。

是否有可能,如果可以,怎么样? 提前致谢!

更新 Nims代码有效。但我现在认识到了一个问题(尽管从一开始就很明显......):如果get()找到一个条目,则[]返回指针。如果未存储,则构造ITEM并返回指针。但RAM永远不会被释放,因为使用容器的算法无法区分已保存的构造ITEMS以删除第二种类型。

2 个答案:

答案 0 :(得分:2)

如果您想为您的对象提供operator [],那么如果以下代码有意义,您必须自己回答:

      MyObj obj;
/*1*/ obj[some_index] = new_object;
/*2*/ Obj& some_object = obj[some_index];

案例1的语义是什么 - 你说:它应该在你的类中插入一些值,但是你用insert(ITEM* i)添加新数据(这里没有提供some_index),所以你应该禁止使用你的班级,如1

现在针对案例2,在您的示例中显示ITEM* get(ITEMINDEX idx),因此您的类客户端代码必须知道什么是ITEMINDEX,因此看起来2案例就可以了。< / p>

问题是IMO仅适用于案例1,并使用operator []插入新数据。如果您查看std::map容器,那么上述两种情况都没有问题。您的类用户希望以与std::map operator []类似的方式使用它,如果它的功能不同则会导致混淆。

答案 1 :(得分:1)

C ++类运算符是一个具有奇怪名称的方法。只要它具有预期的奇怪名称,它就可以做任何你想做的事情。在operator []的情况下,它看起来像

template <typename T>
T& operator[](std::size_t idx)       { /* arbitrary code */ };

关于它的真实情况。

这个界面很受限制。您将获得一个索引,并且需要在响应中生成对类实例的引用。您可以返回对具有关于作业的不寻常想法的内容的引用,例如在赋值时,它使用通过内部指针访问的数据结构进行一些检查。在这条道路上可能会有很多偶然的复杂性。