繁体   English   中英

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

[英]Overload [] C++ operator for complex data-structure

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

因此,我有一个insert(ITEM * i)方法,该方法检查是否需要显式存储i,然后将其存储到映射中,或者可以动态地重建它。 然后,仅存储已添加项目的信息。

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

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

有可能吗?如果可以,怎么办? 提前致谢!

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

如果您想为对象提供operator [],则必须遵循以下代码才能自我回答:

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

情况1语义是什么-您说:它应该在您的类中插入一些值,但是您需要使用insert(ITEM* i)添加新数据insert(ITEM* i)此处未提供some_index),因此您应禁止使用该类,以防万一的1

现在,对于情况2 ,在您的示例中,您将显示ITEM* get(ITEMINDEX idx) ,因此您的类客户端代码必须知道什么是ITEMINDEX,因此情况2看起来可以。

问题是只有情况1的IMO,并且使用operator []插入新数据。 如果您查看std::map容器,则上述两种情况都没有问题。 您的类用户将希望以与std::map operator []类似的方式使用它,如果其功能不同,则会引起混乱。

A C ++类操作者是具有奇怪的名称的方法。 只要它具有预期的怪异名称,它就可以做您想做的任何事情。 在操作符[]的情况下,它看起来像

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

真的就是所有这些。

此接口非常受限制。 你会得到一个指标,需要产生响应您的类的实例的引用。 您可以返回通过内部指针访问一个数据结构的东西有关分配不寻常的想法,例如在分配的参考它做一些检查。 可能有很多偶然的复杂性沿着这条道路。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM