我在设计实现中遇到一些问题时遇到了麻烦。它是这样的:
我有一个模板基类,它有一个转换方法。
// Foo.h
class Bar;
template<typename T>
class Foo {
virtual const Bar toBar();
}
我希望派生类Bar继承特定形式的Foo,例如:
// Bar.h
class Bar : public Foo<float> {
// Insert Bar methods here, Etc.
}
由于Foo是一个模板,实现必须在头文件中完全定义,这会导致方法toBar()的实现需要能够创建Bar类型的实例。所以这告诉我需要在Foo定义之后但在Foo实现之前包含Bar.h头文件。
但是,在Bar.h中,类Bar来自Foo,因此必须提供Foo的完整定义。这会导致问题,因为这两个文件具有无法通过前向声明解决的循环依赖,因为前向声明是派生类。
如果另一个类SomeClass有一个类型为Bar的数据成员,这会变得更复杂,包括包含Foo.h的Bar.h(因为它是一个模板) 包括Bar.h。
哦,只是要清楚所有头文件都有使用
的包含警卫#ifndef _HEADER_NAME_H_
#define _HEADER_NAME_H_
...
#endif
其他人如何解决这样的复杂问题?
作为一个更具体的例子,我说我有一个Array类,它有一个方法将它转换为人类可读的String类,如toString()......但是String类声明为
class String : public Array<char> {...};
提前致谢。 加里。
答案 0 :(得分:1)
为了使Foo< float >
成为基类,它必须完全由Bar
定义点定义。但是,Foo
并非必须了解Bar
,如果您可以将Bar
作为Foo
中的从属类型名称。
在定义Bar
之前,Foo
的前瞻性声明可能就足够了。如果你发布/链接更具体的代码,我可能会给你一个更好的答案。
试试这个:
class Bar;
template< typename T, typename DependantBar = Bar >
class Foo {
virtual const DependantBar toBar();
}
答案 1 :(得分:0)
class Bar : public Foo<float> {
template <typename T>
Bar create(const Foo<T>&);
}