我在实现工厂方法的一些变体时遇到了问题。
// from IFoo.h
struct IFoo {
struct IBar {
virtual ~IBar() = 0;
virtual void someMethod() = 0;
};
virtual IBar *createBar() = 0;
};
// from Foo.h
struct Foo : IFoo { // implementation of Foo, Bar in Foo.cpp
struct Bar : IBar {
virtual ~Bar();
virtual void someMethod();
};
virtual Bar *createBar(); // implemented in Foo.cpp
};
我想将 Foo::Bar 的声明放在Foo.cpp
. 现在我不能成功:
struct Foo : IFoo {
//struct Bar; //1. error: invalid covariant return type
// for ‘virtual Foo::Bar* Foo::createBar()’
//struct Bar : IBar; //2. error: expected ‘{’ before ‘;’ token
virtual Bar *createBar();
// virtual IBar *createBar(); // Is not acceptable by-design
};
是否有一个技巧来提前声明Boo
inFoo.hpp
和完整声明 in Foo.cpp
?
编辑:看起来,我没有清楚地显示错误。所以,有更详细的样本。
第一次尝试前向声明:
struct Foo : IFoo { struct Bar; virtual Bar *createBar(); //<- Compile-error }; //error: invalid covariant return type for ‘virtual Foo::Bar* Foo::createBar()’
前向声明的第二次尝试:
struct Foo : IFoo { struct Bar : IBar; //<- Compile-error virtual Bar *createBar(); }; // error: expected ‘{’ before ‘;’ token
有人可以提议更改
createBar
(fromBar
toIBar
)的返回类型struct Foo : IFoo { virtual IBar *createBar(); };
但是,这种解决方法在设计上是不可接受的