【问题标题】:Cannot assign to this不能分配给这个
【发布时间】:2013-03-11 07:18:23
【问题描述】:

我有这样的课:

class Node {
    // data
    Node* next;
    void operator++(int);
};

当我像这样定义后增量运算符时:

void Node::operator++(int) {
    this = this->next;
}

我在this = this->next; 上收到错误Expression is not assignable

这是怎么回事?如何让this 指向next

【问题讨论】:

  • this 只能用作用于引用当前实例的指针。分配给this 是没有意义的。你为什么要这样做?
  • 也许你可以换成Node* Node::operator++(int) { return this->next; }
  • 顺便说一句,postfix operator++ 返回 void 是相当奇怪的。这势必会让用户感到困惑。人们会期望它返回Node
  • @Jichao operator++(int) of Node 应该返回 Node,而不是 Node*

标签: c++


【解决方案1】:

甚至不要尝试。它不会起作用,如果你能让它起作用,那无论如何都是一件坏事。

从外观上看,您的节点类似于链表。如果是这种情况,那么您通常想要的是:

template <class T>
class linked_list { 

    class node { 
        node *next;
        T data;
    };

    node *head;
public:
    class iterator { 
        node *n;
    public:
        iterator(node *n=NULL) : n(n) {}

        iterator &operator++() { 
            n=n->next;
            return *this;
        }
        bool operator!=(iterator const &other) const { 
            return n != other.n;
        }
        // ...        
    };

    iterator begin() { return iterator(n); }
    iterator end()   { return iterator();  }
};

【讨论】:

  • 所以基本上使用linked_list::iterator++运算符来遍历列表,而不是试图给linked_list::node它自己的++运算符?
  • 我怀疑operator++ 是否正确,应该是return *this;
  • @MichaelDorst:正确。递增链表的节点根本没有多大意义。增加一个迭代器。
【解决方案2】:

这是无法更改的。它是恒定的。

【讨论】:

    【解决方案3】:

    根据 C++ 标准,this 指针是一个 prvalue 表达式(参见 [class.this]),但是赋值运算符需要一个 lvalue 作为其左操作数(见[expr.ass])。

    【讨论】:

      【解决方案4】:

      你不能那样做。即使您通过一些肮脏的技巧更改this,更改也不会传播给调用者。 this 是方法的隐藏形式参数。

      【讨论】:

        【解决方案5】:

        您刚刚发现了为什么 STL 有 迭代器。迭代器将指向节点的指针作为其自身的成员,或者在某些情况下它是指针。它也可以修改它的成员变量。也许尝试类似:

        class Iterator {
            Node* node;
        public:
            Iterator(Node* n)
                : node( n )
            {}
        
            Iterator& operator++()
            {
                node = node->next;
                return *this;
            }
        
            Iterator operator++(int)
            {
                Node* current = node;
                node = node->next;
                return Iterator(current);
            }
        
            Node& operator*()
            {
                return *node;
            }
        
            const Node& operator*() const; // etc...
        };
        

        【讨论】:

        • 如果取消引用运算符返回node-&gt;data 不是更有意义吗? (假设data 是我们正在迭代的成员的名称)还是提供对节点的访问而不仅仅是值更好?
        • 是和不是。这将与所有其他迭代器的工作方式完全不一致。一开始可能看起来很方便,但它有点过于“神奇”,破坏了清晰的层次感。如果您将Node 变成容器的内部类并且Iterator 成为该设计的一部分,您当然可以开始直接返回对数据的引用。一般来说,我建议您阅读更多关于 STL 中的容器和迭代器的内容,因为该主题过于宽泛,无法在此处进行简单的问答。
        【解决方案6】:

        你似乎很困惑你在这里要做什么。您有一个 node 类,它代表列表中的一个节点。通常还会有一个iterator 类,它代表您当前在列表中的位置。在我看来,您正在尝试使用 ++ 迭代到列表中的下一个项目,但要做到这一点,您需要将迭代器作为它自己的一个类。

        一般来说,分配给this 指针是没有意义的——this 指的是当前对象上下文,你不能仅仅通过设置this 指针来改变那个上下文。

        希望对你有所帮助。

        【讨论】:

          【解决方案7】:

          隐藏参数“this”与“const”限定符一起传递。因此无法更改。 Hidden this

          【讨论】:

            猜你喜欢
            • 2012-08-10
            • 1970-01-01
            • 2021-05-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多