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当然会。你要么允许访问,要么不允许。访问器至少限制您提供的访问类型(即,在本例中为只读)以及对哪些成员的访问。如果您只想授予对一个类或函数的访问权限,那么朋友
是您唯一的选择,但它将允许该朋友对所有私有和受保护成员的所有访问权限。