2017-09-16 12 views
-2

私は現在C++を学んでおり、そのために私が作った古いPythonスクリプトを使用しました。 PythonのコードはC++でVARを定義するために、どのように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() 

のように見えるのですか? ありがとうございます。

+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

'auto'は**類似**ですが、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

これは動的割り当てが不必要に必要であり、 'new' /' delete'が現代のC++で決して使用されるべきではないので、下降します。ascheplerは言ったように、スマートポインタは簡単です。 –

0

使用std::variantまたはboost::variant:。

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

エクサmple:

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

fooを呼び出す:

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

ありがとうあなたはこの方法で行くだろう! EDIT: 私のプロジェクトでは悲しいことに、C++ 17しか利用できません。しかし、私は将来それが可能であることを知ってもいいです。 – graphos

+0

このようにして、 'var.foo();'を呼び出すことはできません。そのため、通常は多態性がより良い解決策です。訪問者を使って 'foo'を呼び出す方法を示すことで、この回答を改善することができます。 – aschepler

+1

@graphos:代わりに 'boost :: variant'を使うことができます。 –

関連する問題