2016-05-18 3 views
1

Ich habe virtuelle Klasse Auto. Von dieser Klasse gibt es verschiedene Child-Klassen.Gemeinsame Design-Schnittstelle für Kind-Klassen der Basisklasse C++

In meiner Schnittstelle, ich habe Funktion

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

Funktionsparameter Typ und auf dieser Grundlage nimmt, entscheidet es, das Auto instanziiert und Fahrt durchführen. Derzeit ich etwas tun, wie folgt vor:

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(); 
} 
} 

Was wäre viel Auto zu instanziiert vor if-else-Schleife und dann nur die richtige Art zuweisen?

Vielen Dank!

+0

Es sollte nicht in der Verantwortung der 'ride' Funktion sein, um abgeleitete Instanzen zu erstellen. Dafür ist eine Fabrik da. Ein String in eine bestimmte Car-Instanz umzuwandeln, ist eine einzige Verantwortung. – chris

+0

Es scheint albern von "Car" für jede Herstellung da draußen zu stammen. Ich hätte einfach eine 'Car'-Klasse und lass sie ihre Marke und ihr Modell als 'std :: string'-Datenelement speichern. – NathanOliver

Antwort

0

Ich denke, Sie sollten eine Factory-Methode verwenden, um die abgeleitete Klasse basierend auf dem Modell zu instanziieren und dann den Basiszeiger verwenden, um die abgeleiteten Methoden (ride()) aufzurufen.

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(); 
} 

Verbrauch:

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

Das OP verwendet C++ 11; 'override' ist eine sichere Wette. – chris

+0

Was ist, wenn meine Klasse Vorlagenklasse ist, wäre das noch eine gültige Option? – user298182

+0

@chris: Einverstanden. Die Überschreibung wurde entfernt. –