C++ [ ] 索引运算符重载为访问器和修改器

Posted

技术标签:

【中文标题】C++ [ ] 索引运算符重载为访问器和修改器【英文标题】:C++ [ ] Index Operator Overloading As Accessor and Mutator 【发布时间】:2017-12-02 22:44:52 【问题描述】:
template <class TYPE>
class DList

    //Declaring private members
    private:
    unsigned int m_nodeCount;
    Node<TYPE>* m_head;
    Node<TYPE>* m_tail;

    public:
    DList();
    DList(DList<TYPE>&);
    ~DList();
    unsigned int getSize();
    void print();
    bool isEmpty() const;
    void insert(TYPE data);
    void remove(TYPE data);
    void clear();
    Node<TYPE>*  getHead();
    ...
    TYPE operator[](int); //i need this operator to both act as mutator and accessor
;

我需要编写一个模板函数来执行以下过程:

// Test [] operator - reading and modifying data
cout << "L2[1] = " << list2[1] << endl;
list2[1] = 12;
cout << "L2[1] = " << list2[1] << endl;
cout << "L2: " << list2 << endl;

我的代码无法使用

list2[1] = 12;

我收到错误 C2106:'=':左操作数必须是左值错误。 我希望 [] 运算符能够使 list2 的第一个索引节点值为 12

我的代码:

template<class TYPE>

     TYPE DList<TYPE>::operator [](int index) 
    
        int count = 0;
        Node<TYPE>*headcopy = this->getHead();
        while(headcopy!=nullptr && count!=index)
        
            headcopy=headcopy->getNext();
        

        return headcopy->getData();
    

【问题讨论】:

运算符[ ] 通常有两个重载,而不是一个。您需要同时实现两者。 See example here 另外,如果DList&lt;T&gt;const 的形式传递并且您尝试在任何方面使用[ ],您的代码将不起作用。这就是为什么你需要第二个重载。 你能告诉我例子吗? void SomeFunc(const DList&lt;int&gt;&amp; d) std::cout &lt;&lt; d[0]; -- 试试看。 [ ] 的所有功能都不起作用,即使您声称现在正在使用的功能也是如此。相反,您将收到编译器错误。要解决这个问题,您需要 const 重载版本。 【参考方案1】:

我的代码无法使用

list2[1] = 12;

我收到错误 C2106:'=':左操作数必须是左值错误。我想要 [] 运算符能够使 list2 的第一个索引节点值为 12

在 C++ 中,我们有所谓的Value Categories。您应该让操作员通过引用返回。因此,将您的声明从:

TYPE operator[](int);

到:

TYPE& operator[](int);

我假设headcopy-&gt;getData(); 同样返回对非局部变量的引用。


正如 PaulMcKenzie 所指出的,您同样需要一个与 const this,又名 const 成员函数重载一起使用的重载。因此我们有:

TYPE& operator[](int);
const TYPE& operator[](int) const;

见What is meant with "const" at end of function declaration? 和Meaning of "const" last in a C++ method declaration?

【讨论】:

如果将DList 作为const 传递给函数,[ ] 仍然无法工作。 so 除了 TYPE& operator[](int);这个实现,我需要我的 [ ] 运算符的第二个实现来为 list2[1] = 12;? @ZuhMenzo,const member-function 重载需要使该运算符在从 const 对象调用时工作。请参阅我的答案中的链接 我明白你的意思,但仍然 list2[1] = 12;当执行此行时,无论列表 2 const 与否,第一个节点的值在我调试时必须变为 12,它仍然进入 TYPE& operator[](int);这个函数 我没有重载 = 运算符,所以我不知何故需要了解 [ ] 何时与 = 一起使用

以上是关于C++ [ ] 索引运算符重载为访问器和修改器的主要内容,如果未能解决你的问题,请参考以下文章

C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?

C++学习(四七一)重载运算符

C++入门运算符重载详解

[c++]第四章概念题 | 运算符重载

实现重载运算符'<<'时出错 - C++

C++:-> 运算符重载:以不同方式处理 const / nonconst 访问