簡體   English   中英

返回非const引用會導致綁定引用錯誤

[英]Returning a non-const reference causes a binding reference error

我使用弱指針和智能指針實現了一個雙鏈表。 該程序正在運行,但我對getPrev簽名方法中的const有疑問。 如果我將const a放在方法簽名的末尾,則會導致綁定引用錯誤

error: binding reference of type 'std::weak_ptr<Node<Integer> >&' to 'const std::weak_ptr<Node<Integer> >' discards qualifiers
         return prev;

那個const的目的不是將*this標記為const嗎? 根據我的理解,返回類型是非const的。

這是代碼, main.cpp

#include <memory>
#include <iostream>
#include "DoubleLinkedList.h"

class Integer {
private:
    int number;
public:
    Integer(int number) : number(number) {}

    int get() { return number; }

};

int main() {

    DoubleLinkedList<Integer> list;
    list.insert(Integer(1));
    list.insert(Integer(2));
    list.insert(Integer(3));
    list.insert(Integer(4));
    list.insert(Integer(5));


    return 0;
}

DoubleLinkedList.h

#include <memory>
#include <vector>
#include <iostream>

template <typename T>
class Node {
private:
    T data;
    std::weak_ptr<Node> prev;
    std::shared_ptr<Node> next;
public:
    Node(): data(0) {}

    Node(const T &object) : data(object) {};

    T getData() const {
        return data;
    }

    void setData(T data) {
        Node::data = data;
    }

    std::weak_ptr<Node> &getPrev() const {
        return prev;
    }

    void setPrev(const std::weak_ptr<Node> &prev) {
        Node::prev = prev;
    }

    std::shared_ptr<Node> &getNext() {
        return next;
    }

    void setNext(const std::shared_ptr<Node> &next) {
        Node::next = next;
    }
};

template <typename T>
class DoubleLinkedList {
private:
    std::shared_ptr<Node<T>> header;
    std::weak_ptr<Node<T>> trailer;
    int size;
public:

    DoubleLinkedList() : size(0) {}

    void insert(const T &value) {
        auto node = std::make_shared<Node<T>>(value);

        if (size++ == 0) {
            header = node;
        } else {
            auto last = trailer.lock();
            last->getNext() = node;
            node->getPrev() = last;
        }
        trailer = node;
    }


};

如果您在const方法中,則所有數據成員都被視為const

也就是說,在這個函數里面:

std::weak_ptr<Node> &getPrev() const

你可以想象這樣的成員變量:

const T data;
const std::weak_ptr<Node> prev;
const std::shared_ptr<Node> next;

應該很清楚,您不能將非const引用返回給const對象:

const int x;

int& getX()
{
  return x; // error
}

引用將允許您修改x即使它是const ,所以這是禁止的(形式上:非const引用不能綁定到const對象)。

內部的const的成員函數Nodeprev是一個const std::weak_ptr<Node> ,所以一個std::weak_ptr<Node>&不能結合到它的確切相同的原因。


看來在insert你打算修改node (通過改變它的prev值),在這種情況下getPrev函數不應該是const(因為你打算修改對象)。 但是這種訪問應該可以保留給DoubleLinkedList而不是一些任意的外部用戶。 然后它成為界面設計的問題:代碼的哪些部分是實現細節以及如何隱藏這些部分? 哪些部分是用戶應該與之交互的界面(破壞事物的機會最小)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM