首页 > 解决方案 > 返回指向成员变量的指针?

问题描述

我试图为我的链表节点类实现封装,但似乎我做错了什么。如何让函数返回指向类内成员变量的指针?

template <typename T>
class DoublyLinkListNode
{
public:
    using value_type = T;
    using reference = value_type&;
    using const_reference = const value_type&;
    using size_type = size_t;

    DoublyLinkListNode() :m_value(value_type()), m_prev(nullptr), m_next(nullptr) {}
    DoublyLinkListNode(const_reference p_value) : m_value(p_value), m_prev(nullptr), m_next(nullptr) {}
    DoublyLinkListNode(const_reference p_value, DoublyLinkListNode* p_prev, DoublyLinkListNode* p_next) : m_value(p_value), m_prev(p_prev), m_next(p_next) {}
    DoublyLinkListNode(value_type&& p_value, DoublyLinkListNode* p_prev, DoublyLinkListNode* p_next) : m_value(p_value), m_prev(p_prev), m_next(p_next) { p_value = value_type(); }

    // Dereference that allows us to write/read into Elem.
    reference operator*() { return m_value; }
    const_reference operator*() const { return m_value; }

    DoublyLinkListNode* previous() { return m_prev; }
    //const DoublyLinkListNode* previous() const { return m_prev; }
    DoublyLinkListNode* next() { return m_next; }
    //const DoublyLinkListNode* next() const { return m_next; }

    private:
    DoublyLinkListNode* m_prev; // previous link.
    DoublyLinkListNode* m_next; // succesor (next) link.
    T m_value;
};
int main()
{
    DoublyLinkListNode<double>* node = new DoublyLinkListNode(5.5);
    DoublyLinkListNode<double> node2(5.5);
    DoublyLinkListNode<double>* node3 = new DoublyLinkListNode(5.5);

    // expression must be a modifiable lvalue?
    node->previous() = node3;

    std::cout << node->operator*() << std::endl;
    return 0;
}

标签: c++

解决方案


“如何让函数返回指向类内成员变量的指针?”

你说的是m_prev。的类型m_prevDoublyLinkListNode*。指向此变量的指针具有类型DoublyLinkListNode**。该函数必须返回DoublyLinkListNode**

DoublyLinkListNode** previous() { return &m_prev; }

你可以用它作为

*(node->previous()) = node3;

但是 C++ 方法是返回引用而不是指针:

DoublyLinkListNode*& previous() { return m_prev; }

你可以用它作为

node->previous() = node3;

目前的实施

DoublyLinkListNode* previous() { return m_prev; }

返回一个临时副本(R 值)。

但是,您应该公开成员,而不是 getter 和 setter 或返回指针/引用的函数:C.131:避免琐碎的 getter 和 setter


推荐阅读