C++ 访问迭代器类中的私有数据而不破坏封装的最佳方法是什么?

C++ 访问迭代器类中的私有数据而不破坏封装的最佳方法是什么?,c++,C++,我有一门课是这样的: template <typename T> class Store { private: struct pointNode { T data; pointNode* next; pointNode* prev; pointNode() :data(0), next(nullptr), prev(nullptr) {} pointNode(T n_data) : data(

我有一门课是这样的:

template <typename T>
class Store {

private:
    struct pointNode {
        T data;
        pointNode* next;
        pointNode* prev;

        pointNode() :data(0), next(nullptr), prev(nullptr) {}
        pointNode(T n_data) : data(n_data), next(nullptr), prev(nullptr) {}

        const T& getValue() {
            return this->data;
        }


    };
    pointNode* head;
    pointNode* tail;

public:

    class Iterator {
        using Iterator_type = Store<T>::pointNode;
    public:
        Iterator() = default;

        Iterator(Iterator_type* rNode) {
            current_node = rNode;
        }

    private:
        Iterator_type* current_node;

    };

};
friend class Store;
class Iterator
{
public:
    Iterator_type* get_current_node() const {
        return current_node;
    }

private:
    Iterator_type* current_node;
};
获取此数据字段的正确方法是什么? 我知道你可以这样做:

template <typename T>
class Store {

private:
    struct pointNode {
        T data;
        pointNode* next;
        pointNode* prev;

        pointNode() :data(0), next(nullptr), prev(nullptr) {}
        pointNode(T n_data) : data(n_data), next(nullptr), prev(nullptr) {}

        const T& getValue() {
            return this->data;
        }


    };
    pointNode* head;
    pointNode* tail;

public:

    class Iterator {
        using Iterator_type = Store<T>::pointNode;
    public:
        Iterator() = default;

        Iterator(Iterator_type* rNode) {
            current_node = rNode;
        }

    private:
        Iterator_type* current_node;

    };

};
friend class Store;
class Iterator
{
public:
    Iterator_type* get_current_node() const {
        return current_node;
    }

private:
    Iterator_type* current_node;
};

在迭代器类内部。但这是正常的,还是有更漂亮的方法?谢谢

这样做的标准方法是添加一个访问器函数,如下所示:

template <typename T>
class Store {

private:
    struct pointNode {
        T data;
        pointNode* next;
        pointNode* prev;

        pointNode() :data(0), next(nullptr), prev(nullptr) {}
        pointNode(T n_data) : data(n_data), next(nullptr), prev(nullptr) {}

        const T& getValue() {
            return this->data;
        }


    };
    pointNode* head;
    pointNode* tail;

public:

    class Iterator {
        using Iterator_type = Store<T>::pointNode;
    public:
        Iterator() = default;

        Iterator(Iterator_type* rNode) {
            current_node = rNode;
        }

    private:
        Iterator_type* current_node;

    };

};
friend class Store;
class Iterator
{
public:
    Iterator_type* get_current_node() const {
        return current_node;
    }

private:
    Iterator_type* current_node;
};


注意,默认构造函数
Iterator()=default
使
当前\u节点
数据成员未初始化。

用户难道不能访问私有数据吗?我只是想阻止用户在插入此文件时访问指针。@Alpharius当然会。你要么允许访问,要么不允许。访问器至少限制您提供的访问类型(即,在本例中为只读)以及对哪些成员的访问。如果您只想授予对一个类或函数的访问权限,那么
朋友
是您唯一的选择,但它将允许该朋友对所有私有和受保护成员的所有访问权限。