【发布时间】:2011-10-14 17:24:26
【问题描述】:
我有一个非模板化类 (Par_list_elem),我想将其内部访问权限授予 Par_list 类(以构建侵入式列表)。
问题:我需要 Par_list_elem 和 它的所有子类 才能被 Par_list 访问。详细来说,唯一需要访问的字段是 _next 和 _prev;明确限制这些字段会很好,但不是必需的。
我已经做了一些初步的尝试,最近的尝试如下:
template <class T> class Par_list {
public:
Par_list() : _head(0) {}
~Par_list();
//Insert element into list
bool insert(T elem);
//Remove element identified by iterator
void erase(iterator itr);
private:
T* _head;
};
class Par_list_elem {
public:
Par_list_elem() : _next(0), _prev(0) {}
//Get next element in list
Par_list_elem* next() { return _next; }
private:
Par_list_elem* _next;
Par_list_elem* _prev;
template <typename> friend class Par_list;
};
template <class T> void Par_list<T>::erase(Par_list<T>::iterator itr) {
T* e = *itr;
T* p;
if ((p = e->_prev) != 0)
p->_next = e->_next;
else
_head = e->_next;
if ((e->_next) != 0)
(e->_next)->_prev = p;
delete e;
}
template <class T> bool Par_list<T>::insert(T* nelem) {
T* curr = _head;
if (curr != 0) {
while (curr->_next != 0)
curr = curr->next();
curr->_next = nelem;
} else
_head = nelem;
nelem->_prev = curr;
nelem->_next = 0;
return true;
}
test.cpp
#include "parsnip_list_back.h"
class elem : parsnip::Par_list_elem {
int _elem;
};
int main (int argc, char** argv) {
parsnip::Par_list<elem> plist;
return 0;
}
这里似乎有一些信息: Template friend 但是目标在细节上有所不同,以至于我被卡住了。
谢谢!
--------更新---------
Par_list_elem 的私有成员访问的每个实例都会发生以下错误。我正在 gcc 4.4 上编译。
parsnip_list_back.h:66: error: ‘parsnip::Par_list_elem* parsnip::Par_list_elem::_prev’ is private
parsnip_list_back.h:124: error: within this context
因此,在当前的实现中,即使是超类也不会放弃它的私有属性。
【问题讨论】:
-
这真的没有意义;你说你需要访问“它的所有子类”,但是你只需要访问基类中定义的字段——这正是代码中
friend声明给你的。究竟是什么问题? -
Par_class 无法访问 Par_list_elem 子类的 _next 和 _prev 字段。这有意义吗?
-
应该可以,因为它们是具有
friend声明的类的成员,而不是子类的成员,并且在我尝试时确实如此。你用的是什么编译器?你遇到了什么错误?你能发布一个Par_list_elem的子类的示例,以及Par_list中的一些代码尝试访问这些成员之一吗? -
我已经用一些额外的信息更新了原始帖子。我应该更清楚地知道出了什么问题:超类在这一点上也不友好。此外,这是一个使用上述代码编译的示例子类,但当前 (key) 未报告任何错误:
class elem : Par_list_elem { int _elem; }; -
请制作一个完整的、独立的、最小的示例来说明您的问题。您发布的代码甚至没有引用任何私人成员。您的错误消息是指您未发布的代码。不可能说你做错了什么。
标签: c++ class templates friend