gpt4 book ai didi

c++ - 派生内部类的前向声明

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:40 24 4
gpt4 key购买 nike

我在实现工厂方法的一些变体时遇到了问题。

// 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
};

Foo.hpp 中仅向前声明 Boo 并在 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 的返回类型(从 BarIBar)

    struct Foo : IFoo {
    virtual IBar *createBar();
    };

    但是,这种解决方法在设计上是 Not Acceptable

最佳答案

不,你不能转发声明某个东西是子类。

当然,既然您无论如何都要隐藏类的详细信息,那么您可以添加另一个间接级别。

struct IFoo {
struct IBar {
virtual ~IBar() = 0;
virtual void someMethod() = 0;
};

virtual IBar *createBar() = 0;
};

// from Foo.h
struct Foo : IFoo {

struct Bar : IBar {};

virtual Bar *createBar();
};

// In Foo.cpp

struct FooBar : Foo::Bar
{
virtual ~FooBar() {}
virtual void someMethod()
{
// Do stuff...
}
};

Foo::Bar* Foo::createBar()
{
return new FooBar;
}

关于c++ - 派生内部类的前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19662249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com