2015-09-10 210 views
0

我對C++有點新,並試圖找出如何解決繼承問題。抽象類的C++繼承

我有通用的Open Frameworks應用程序BaseApp,然後是MainApp,這是BaseApp中框架的特定實現。

應用程序可以呈現全屏圖層並緩衝另一圖層進行過渡。圖層也從BaseLayer類擴展而來,像BaseApp在擴展之前不會執行任何操作。

所以

class BaseApp : public ofBaseApp { 
    public: 
     BaseLayer renderLayer; 
     BaseLayer bufferedLayer; 
} 
// ... 
class MainApp : public BaseApp { 
    public: 
     VideoLayer videoLayer; // Video + Image layers extend BaseLayer 
     ImageLayer imageLayer; 
} 

而我想要做的是說,我的renderLayer是我imageLayer,我的bufferedLayer是我videoLayer,即:renderLayer = (some class which extends layer)所以我BaseApp裏面我可以把它當作一個基礎層在我MainApp我可以把它當作一個VideoLayer,ImageLayer等

我結束了shared_ptr的,這似乎髒實現這一點,但工作原理:

class BaseApp : public ofBaseApp { 
    public: 
     shared_ptr<BaseLayer> renderLayer; 
} 

// inside MainApp.setup() 
    renderLayer = make_shared<ImageLayer>(); 
    if (shared_ptr<ImageLayer> imageLayer = dynamic_pointer_cast<ImageLayer>(renderLayer)){ 
     // ImageLayer specific setup 
     imageLayer->setup("assets/tiger.png",0,0,800,600); 
    } 

有沒有更簡單的方法來實現這個目標?我一直試圖堅持oF風格,儘可能少的指針,所以一個圖層是一個POD類。

回答

1

我建議加入virtual函數來獲取渲染層和緩衝層。

class BaseApp : public ofBaseApp { 
    public: 
     virtual BaseLayer& getRenderLayer() = 0; 
     virtual BaseLayer& getBufferedLayer() = 0; 
}; 

// ... 
class MainApp : public BaseApp { 
    public: 

     virtual BaseLayer& getRenderLayer() { return imageLayer;} 
     virtual BaseLayer& getBufferedLayer() { return videoLayer; } 

    private: 
     VideoLayer videoLayer; // Video + Image layers extend BaseLayer 
     ImageLayer imageLayer; 
}; 

在適當的地方添加const

+0

我仍然需要根據需要交換圖層,渲染和緩衝圖層並不總是圖像和視頻圖層,但我確實喜歡這樣刪除所有的投射。 – mcornell

+0

@mcornell,如果您有任何問題,請張貼另一個問題。 –

0

我不知道爲什麼你需要shared_pointer這個,一個簡單的unique_pointer會做得很好。

只有兩種方式來處理C++中的運行時多態對象 - 無論是通過指針還是通過引用。 引用似乎不適合你的設計,所以你被指針卡住了。如果你不喜歡指針,則重新設計不使用運行時多態。