3

我在解决设计实现中的一些问题时遇到了麻烦。它是这样的:

我有一个模板基类,它有一个转换方法。

// 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 类型的数据成员,这将变得更加复杂,因为这需要包括 Bar.h,其中包括 Foo.h(因为它是模板)包括 Bar.h。

哦,只是要清楚所有的头文件都有包含保护使用

#ifndef _HEADER_NAME_H_
#define _HEADER_NAME_H_
...
#endif

其他人是如何解决此类复杂问题的?

作为一个更具体的例子,我有一个 Array 类,它有一个方法可以将它转换为人类可读的 String 类,例如 toString() ......但是 String 类被声明为

class String : public Array<char> {...};

提前致谢。加里。

4

2 回答 2

1

为了Foo< float >成为一个基类,它必须已经被定义点完全Bar定义。但是,Foo如果Bar您可以BarFoo.

Bar在定义之前的前向声明Foo可能就足够了。如果您发布/链接更具体的代码,我可能会给您一个更好的答案。

尝试这个:

class Bar;

template< typename T, typename DependantBar = Bar >
class Foo {

    virtual const DependantBar toBar();

}
于 2011-09-15T21:42:40.233 回答
0
class Bar : public Foo<float> {
    template <typename T>
    Bar create(const Foo<T>&);
}
于 2011-09-15T21:45:08.603 回答