C ++ []运算符重载问题

时间:2011-02-24 09:31:51

标签: c++ overloading operator-keyword

我还是C ++的新手所以我每天遇到新的问题。

今天来了[]运营商:

我正在使自己成为一个新的通用List类,因为我不太喜欢std的那个。我试图给它C#的Collections.Generic列表的温暖和模糊的外观,所以我希望能够通过索引访问元素。切入追逐:

从模板中提取:

T& operator[](int offset)
    {
        int translateVal = offset - cursorPos;

        MoveCursor(translateVal);

        return cursor->value;
    }

    const T& operator[](int offset) const
    {
        int translateVal = offset - cursorPos;

        MoveCursor(translateVal);

        return cursor->value;
    }

这是运营商的代码。模板使用“模板”,所以就我在一些教程中看到的那样,这是进行操作符重载的正确方法。

然而,当我试图通过索引访问时,例如:

Collections::List<int> *myList;
myList = new Collections::List<int>();
myList->SetCapacity(11);
myList->Add(4);
myList->Add(10);
int a = myList[0];

我得到了

    no suitable conversion function from "Collections::List<int>" to "int" exists

错误,指的是“int a = myList [0]”行。基本上“myList [0]”类型仍然是“Collections :: List”,虽然它应该只是int。怎么来的?

3 个答案:

答案 0 :(得分:14)

由于myList是指针myList[0]未调用operator[],因此它返回Collections::List<int>*。你想要的是(*myList)[0]。或者更好的是,Collections::List<int>& myRef = *myList;然后使用myRef[0](其他选项不在堆上为myList分配内存,您可以使用Collections::List<int> myList在堆栈上创建它,然后使用.运营商)。

答案 1 :(得分:2)

myList的类型为指向List 的指针,而不是List。如果指针类型的表达式后跟方括号中的整数值(例如myList [0]),则结果与“将0添加到指针值并且取消引用”相同它”。将0添加到列表地址并取消引用它的结果只会产生列表。

过去使用C#和Java的程序员过度使用C ++ new 是很常见的。在发布的示例中,最好使用Collections::List<int> myList;.运算符代替->

答案 2 :(得分:0)

很好,您想学习C ++并练习编写自己的集合,但您的逻辑可能存在缺陷。

std::vectorstd::deque已经允许进行常量随机访问。 std::deque更像是一个列表,因为它允许在任一端进行常量插入和删除,并且不会因插入而使引用或迭代器无效。

您似乎也将您的集合与其迭代器混合到一个类中,以便集合包含当前位置。我很确定C#集合没有以这种方式实现。

最后我想你的MoveCursor命令是O(N),这意味着你根本就没有随机访问。

如果您想要快速随机访问和插入时间,您可以使用树结构管理的最好是O(log N),树上的每个节点都指示其下面每个分支中的元素数量。因此,您可以找到沿正确路径递归的第n个元素。插入也是O(log N),因为你必须递归修改计数的树,你当然必须定期平衡树。