Tôi có hai lớp, Foo<T>
và Bar<T>
, có nguồn gốc từ Base
. Mỗi ghi đè phương thức virtual Base* convert(ID) const
, trong đó ID
là phiên bản của một loại xác định duy nhất một phiên âm cụ thể của Foo
hoặc Bar
(giả vờ là enum
). Vấn đề là Foo::convert()
cần phải có thể trả lại phiên bản Bar
và tương tự như vậy Bar::convert()
cần phải có thể khởi tạo Foo
. Vì chúng là cả hai mẫu, điều này dẫn đến sự phụ thuộc vòng tròn giữa Foo.h
và Bar.h
. Làm cách nào để giải quyết vấn đề này?Giải quyết sự phụ thuộc thông tư giữa các lớp mẫu
Edit: Một tờ khai phía trước không hoạt động vì việc thực hiện mỗi phương pháp cần constructor của lớp khác:
Foo.h
:
#include <Base.h>
template<class T> class Bar;
template<class T>
class Foo : public Base { ... };
template<class T>
Base* Foo<T>::convert(ID id) const {
if (id == BAR_INT)
return new Bar<int>(value); // Error.
...
}
Bar.h
:
#include <Base.h>
template<class T> class Foo;
template<class T>
class Bar : public Base { ... };
template<class T>
Base* Bar<T>::convert(ID id) const {
if (id == FOO_FLOAT)
return new Foo<float>(value); // Error.
...
}
Lỗi là, một cách tự nhiên, "sử dụng không hợp lệ loại không đầy đủ".
phụ thuộc Cyclic hiếm khi một ý tưởng tốt. Hãy thử cấu trúc lại nó để phụ thuộc bị hỏng. Ý tưởng đầu tiên là chuyển phương thức 'convert' thành một hàm miễn phí phụ thuộc vào cả' Bar' và 'Foo' ... –