gpt4 book ai didi

c++ - 返回非常量引用会导致绑定(bind)引用错误

转载 作者:太空狗 更新时间:2023-10-29 21:09:48 24 4
gpt4 key购买 nike

我已经使用弱指针和智能指针实现了一个双链表。该程序正在运行,但我对 getPrev 签名方法中的 const 有疑问。如果我将 const 放在方法签名的末尾,它将导致绑定(bind)引用错误

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

const 的目的不是将 *this 标记为 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 引用不能绑定(bind)到 const 对象)。

const 里面Node 的成员函数, prevconst std::weak_ptr<Node> , 所以 std::weak_ptr<Node>&出于完全相同的原因无法绑定(bind)到它。


似乎在 insert 内你打算修改 node (通过更改其 prev 值),在这种情况下 getPrev function 不应该是 const(因为你打算修改对象)。但是这种访问可能应该保留给 DoubleLinkedList。而不是一些任意的外部用户。然后它就变成了界面设计的问题:代码的哪些部分是实现细节,应该如何向用户隐藏这些细节?界面的哪些部分是用户应该与之交互的(破坏事物的机会最小)?

关于c++ - 返回非常量引用会导致绑定(bind)引用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57057185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com