首先,感谢任何能帮助我的人。我目前正在研究XML解析器。这是我不久前的事情:
class Root
{
// bla bla
}
Root是链表的第一项。它有一个指向第一个项目的指针,以及从列表中添加和删除项目的功能。
class Base
{
// bla bla
}
Base类是一个简单的Item,带有指向下一个项目的指针。
class Child : public Base
{
// bla bla
};
Child类派生自Base类,包含数据(例如元素的名称和值以及XML文件的属性)。
class Derived_1 : public Child
{
// bla bla
};
class Derived_2 : public Child
{
// bla bla
};
Derived类是我的属性和我的元素。元素包含Root用于属性列表,另一个用于元素列表(因此我可以构建层次结构)。
我的基类需要包含Root的功能,但不能将它们作为子进程继承。所以我们"朋友" Base类中的Root函数。
class Base
{
friend class Root
// bla bla
}
最近,我们讨论了模板,并且必须将它们集成到XML解析器中。所以,首先,我们在模板中转换了Root类。因此,Root用于两个Derived类,Base类以这种方式受到影响:
template< class T >
class Root
{
// bla bla
}
-------------
class Derived_1;
class Derived_2;
class Child;
class Base
{
friend class Root<Derived_1>
friend class Root<Derived_2>
friend class Root<Child>
// bla bla
}
-------------
class Child : public Base
{
// bla bla
};
直到现在,没问题。我们必须转发声明Derived类以避免包含中的循环。然后,我们必须使Base类成为模板,所以我们有:
class Derived_1;
class Derived_2;
class Child;
template< class T >
class Base
{
friend class Root<Derived_1>
friend class Root<Derived_2>
friend class Root<Child>
// bla bla
}
-------------
class Child : public Base<Child>
{
// bla bla
};
然后,问题出现了,我们让Child类成为模板,所以它变成了:
template< class T >
class Child : public Base<T>
{
// bla bla
};
但是,Base类中的前向声明不再好了,我们也没有声明好友类的方式。我必须找到一种方法来转发声明Child类,但我不知道如何。到现在为止,我没有遇到任何困难,但在这里,我没有看到它背后的逻辑。有人可以向我解释一下这里的工作方式(我没有要求答案,我只需复制/过去你告诉我的内容,但我想了解发生了什么。非常感谢帮助
答案 0 :(得分:2)
您的困难似乎源于类和类模板之间的差异。特别是,为了使从类模板实例化的前向声明类型成为朋友,您需要转发声明类模板:
template <class T> class Child;
然后你可以与它交朋友:
template <class T> class Base
{
friend class Child<T>; // or
friend class Root< Child<T> >;
: : :
};
但请注意,友谊是coupling中最严格的形式,如果有更好的方法可以达到目的,就应该避免。