У меня возникли проблемы с устранением некоторых изломов в реализации дизайна. Это выглядит примерно так:
У меня есть базовый класс шаблона, у которого есть метод преобразования.
// 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. Это говорит о том, что мне нужно включить файл заголовка Bar.h после определения Foo, но до реализации Foo.
Однако в 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> {...};
Заранее спасибо. Гэри.
template<typename T> class Foo : public IBaseClass { }
и определилIBaseClass
как чистый виртуальный базовый класс. - person Skizz   schedule 16.09.2011