2016-05-18 7 views
1

私は仮想クラスの車を持っています。 このクラスには異なるChildクラスがあります。私のインターフェイスで基本クラスC++の子クラスのための共通のデザインインタフェース

、私持っている機能

ride(std::string type = "mercedes") 

機能は、パラメータの型を取り、これに基づいて、それはインスタンス化と乗り心地を実行している車、決定します。 if-elseループの前に車をインスタンス化してからちょうど適切なタイプを割り当てる方法だろう

ride(std::string type = "mercedes") 
{ 
    if(type =="btw") 
{ 
    auto car = std::make_shared<BMW>(); 
    car.ride(); 

} 
else if(type =="audi") 
{ 
    auto car = std::make_shared<Audi>(); 
    car.ride(); 
} 
default 
{ 
    auto car = std::make_shared<Mercedes >(); 
    car.ride(); 
} 
} 

何: 現在、私は次のような何か?

多くの感謝!

+0

導出インスタンスを作成するには、 'ride'関数の責任ではありません。これは工場のためのものです。文字列を特定のCarインスタンスに変換することは単一の責任です。 – chris

+0

そこには各メーカーのために「カー」から派生しているのは馬鹿馬鹿しいようです。私は 'Car'クラスを持っていて、そのmakeとモデルを' std :: string'データメンバとして保存させます。 – NathanOliver

答えて

0

モデルに基づいて派生クラスをインスタンス化するためにファクトリメソッドを使用して、派生メソッド(ride())を呼び出すためにベースポインタを使用する必要があると思います。

Car{ 
public: 
    static Car* Factory(std::string type = "mercedes") { 
    if(type == "mercedes") 
    return std::make_shared<Mercedes>(); 
    else if(type == "bmw") 
    return std::make_shared<BMW>(); 
    } 
    virtual int ride(); 
} 

使用法:

Car *car = Car::Factory("mercedes"); 
car->ride(); 
+0

OPはC++ 11を使用しています。 'override'は安全な賭けです。 – chris

+0

私のクラスがテンプレートクラスの場合、それでも有効なオプションはありますか? – user298182

+0

@chris:同意しました。上書きを削除しました。 –

関連する問題