2015-10-01 200 views
2

假設我有一個抽象基類:正向聲明嵌套stucture在基類

class Foo { 
public: 
    struct FooStruct; 
    virtual FooStruct *DoFoo() = 0; 
}; 

現在我想實現在BarDoFoo,還可以定義FooStruct裏面:

class Bar: public Foo { 
public: 
    struct FooStruct { 
     int data; 
    }; 
    FooStruct *DoFoo() { 
     FooStruct *fs = new FooStruct; 
     fs->data = 42; 
     return fs; 
    } 
}; 

然而,g++(在我的情況下)承認Foo::FooStructBar::FooStruct作爲兩種不同的結構,並會抱怨invalid covariant type ...,因爲我重新定義返回類型的a 方法。

我該如何解決這個問題?

+0

您還需要定義'Foo :: FooStruct'。您定義'Bar :: FooStruct'的事實並不重要。 –

+1

您需要一個通用的基類來獲取返回的值。 –

回答

1

我猜你的章節目標然後做一些如:

Foo * my_foo = new Bar(); 
FooStruct * my_result = my_foo->DoFoo(); 

的問題是,使用my_result現在,你必須知道它是隱含已由Bar創建一個struct。因此,您應該定義返回的structFoo

0

你不能做你看似想要做的事情。虛擬函數在層次結構中應該具有相同的靜態返回類型,而Foo :: FooStruct與Bar :: FooStruct無關。你似乎渴望的東西如下所示:

// In Foo.h 
struct FooStruct { virtual ~FooStruct() = default; } 

class Foo { 
public: 
    virtual FooStruct* DoFoo() = 0; 
    virtual ~Foo() = default; 
}; 

// In Bar.h 
struct DerivedFooStruct : FooStruct { }; 
struct Bar : public Foo { 
    FooStruct* DoFoo() { return new DerivedFooStruct(); } // Never mind memory mgmt 
}; 
0

您正試圖創建一個不適合C++類型系統的怪物。

想象有人試圖使用Foo指針多態:

Foo* ptr = .... ; //getting the value from somewhere, e.g. an API call 
??? result = ptr->DoFoo(); 

這是怎麼回事是返回值的類型?編譯器不知道它。

爲您要返回的結構使用通用基類。前瞻性聲明不會削減它。