2017-09-16 104 views
-2

我目前正在學習C++,爲此我帶了一個我製作的舊python腳本。 的Python代碼是看起來像C++可變多類型有可能嗎?

class A(object): 
    def foo(self): 
     print 'a' 

class B(object): 
    def foo(self): 
     print 'b' 

var = None  
if something: 
    var = A() 
else: 
    var = B() 

var.foo() 

因此,如何在C++定義變種? 在此先感謝。

+1

你嘗試過這麼遠嗎?這是如何工作,或沒有奏效?請閱讀[幫助頁面](http://stackoverflow.com/help),尤其是名爲[「我可以詢問什麼主題?」](http://stackoverflow.com/help/on-topic)和[「我應該避免問什麼類型的問題?」](http://stackoverflow.com/help/dont-ask)。還請[參觀](http://stackoverflow.com/tour)和[閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask)。最後,請學習如何創建[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –

+1

在'python中有'**'類似**,但與'var'不完全一樣。除此之外,C++是一種靜態類型語言,而Python是動態類型的,因此不存在直接模擬。 – hnefatl

+1

另外,***爲什麼你要問? *實際*問題是什麼?這看起來像一個[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem),您需要幫助修復解決方案以解決我們未知的問題。也許對原始問題有更好的解決方案? –

回答

-1

C++是一種強類型語言,因此編寫該代碼無法轉換爲C++。

您可以通過使用一個接口/抽象基類做類似的事情:

class Foo 
{ 
public: 
    virtual void foo() = 0; 
}; 

class A : public Foo 
{ 
public: 
    virtual void foo() 
    { 
     std::cout << "a"; 
    } 
}; 

class B : public Foo 
{ 
public: 
    virtual void foo() 
    { 
     std::cout << "b"; 
    } 
}; 

int main(int arg, char** argv) 
{ 
    Foo* foo = nullptr; 
    if(...) 
    { 
     foo = new A(); 
    } 
    else 
    { 
     foo = new B(); 
    } 

    foo->foo(); 
    delete foo; 
} 

(請注意,它是更好的使用智能指針在這裏,而不是顯式調用newdelete,但我想保持代碼簡單)

+3

使用智能指針*更簡單! – aschepler

+0

即使變體是非常有說服力的,這種方法將適用於所有cpp版本,然後感謝它! – graphos

+0

因爲這不必要地需要動態分配,並且因爲在現代C++中永遠不會使用'new'''''',所以需要花費較少的代價。aschepler說,智能指針更簡單。 –

0

使用std::variantboost::variant

using AorB = std::variant<A, B>; 

了Exa mple:

AorB var; 
if(something) var = A{}; 
else var = B{}; 

調用foo

std::visit([](auto& x){ x.foo(); }, var); 
+0

謝謝你會這樣! 編輯: 可悲的是隻有c + + 17,這是不適用於我的項目。但我很高興知道未來我可能會有這種可能。 – graphos

+0

儘管如此,通過這種方式,您不能調用var.foo();這就是多態性通常是更好的解決方案的原因。您可以通過演示如何使用訪問者調用'foo'來改進此答案。 – aschepler

+1

@graphos:你可以使用'boost :: variant'來代替。 –

相關問題