前向声明子类模板
Forward declare child class template
首先,感谢所有能帮助我的人。我目前正在研究XML解析器。这是我不久前所拥有的:
class Root
{
// bla bla
}
根是链表的第一项。它有一个指向第一个元素的指针,以及从列表中添加和删除元素的函数。
class Base
{
// bla bla
}
基类是一个简单的Item,带有一个指向下一个Item的指针。
class Child : public Base
{
// bla bla
};
子类是从基类派生出来的,并且包含数据(例如我的XML文件的元素和属性的名称和值)。
class Derived_1 : public Child
{
// bla bla
};
class Derived_2 : public Child
{
// bla bla
};
派生类是我的属性和元素。Elements包含一个属性列表的Root,和一个元素列表的Root(这样我就可以构建一个层次结构)。
我的基类需要包含根的函数,但不能作为子类继承它们。所以我们在基类中将根函数"加为好友"。
class Base
{
friend class Root
// bla bla
}
最近,我们谈到了模板,并且必须将它们集成到XML解析器中。因此,首先,我们在模板中转换根类。因此,根被用于两个派生类,基类受到如下影响:
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
};
到现在为止,没有问题。我们必须向前声明派生类,以避免include中的循环。然后,我们必须使基类成为模板,所以我们有:
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
};
然而,基类中的前向声明不再好了,我们声明友类的方式也是如此。我必须找到一种方法来向前声明Child类,但我不知道该怎么做。直到现在,我还没有遇到任何困难,但在这里,我看不出它背后的逻辑。有人能向我解释一下这里的工作方式吗(我不要求答案,我只需要复制/过去你告诉我的,但我想了解发生了什么。)非常感谢您的帮助。
您的困难似乎源于类和类模板之间的差异。特别地,为了添加从类模板实例化的前向声明类型,您需要前向声明类模板:
template <class T> class Child;
那么你可以加它为好友:
template <class T> class Base
{
friend class Child<T>; // or
friend class Root< Child<T> >;
: : :
};
但请注意,友谊是最紧密的耦合形式,当有更好的手段达到你的目的时,应该避免。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- c++类声明时,相同的例程,不同的成员变量类型
- 从父类方法返回子类对象
- 如何在C++中获取该对象的类声明中对象的地址?
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 将子类方法声明为基类的友元
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 声明基类类型的指针,但随后通过指向子类来实例化它.这是良好的编程实践吗?
- 何时应在Qt中将子对象声明为其父类的成员变量
- 我们如何有证据表明,声明虚拟函数的类是2个字节,其中一个不超过一个未声明,而在子类中
- 通过"a pointer of the base class"访问未在基类中声明的子类的方法或属性(动态)
- 如何正确声明子类?(C++)
- 为什么我需要在子类中重新声明"虚拟"方法?[C++/多态性]
- CLANG VS GCC 模板子类在父级中使用前向声明的类
- 在父类中声明并在子类中定义
- 从模板类继承,类型在子类中声明
- 前向声明子类模板