2017-12-06 4 views
0

So habe ich ein Programm mit den Klassen Auto, Route und Taxi. Ich verwende Komposition, um die Daten aus den Klassen Auto und Route zu erhalten. Jede Klasse muss in der Lage sein, eigene Daten einzugeben und die eingegebenen Daten zu prüfen. Ich habe Schwierigkeiten damit, den Konstruktor der Taxi-Klasse so zu gestalten, wie er sie benutzt und prüft die Daten mit den Get/Set-Methoden der Klassen Auto und Route. Zugriff auf die Parameter in der setRouteTaxidata Methode?C++ Zusammensetzung Konstruktor

Irgendwelche Vorschläge?

class RouteTaxi { 
    private: 
     int id; 
    public: 
     Car car; 
     Route route;  
     RouteTaxi(); 
     ~RouteTaxi(); 
     void setRouteTaxidata(string cbrand, string cmodel, int cyears, int cseatingCapacity, double cloadCapacity, double cfuelConsumption,string rnodes, double rrouteLength, int rtoursPerDay, int i); 


}; 

RouteTaxi::RouteTaxi(){ 
    setRouteTaxidata(??) ?????? 
} 

void RouteTaxi::setRouteTaxidata(string cbrand, string cmodel, int cyears, int cseatingCapacity, double cloadCapacity, double cfuelConsumption, string rnodes, double rrouteLength, int rtoursPerDay, int i){ 
    car.setBrand(cbrand); 

} 

Antwort

0

Ihr Konstruktor RouteTaxi() ist ein Standardkonstruktor. Es muss ein gültiges Objekt ohne diese erstellen, so dass Sie akzeptable Standardwerte haben müssten.

Es gibt keine gute Möglichkeit, eine Standardroute zu machen, es sei denn, Sie eine „nirgendwo“ Route mit einem „Nocar“ Auto haben, so können Sie stattdessen diese Argumente im Konstruktor, wie in diesem Beispiel benötigen:

#include<string> 
using std::string; 

class Car { 
public: 
    Car(string cbrand, string cmodel, int cyears, int cseatingCapacity, double cloadCapacity, double cfuelConsumption){} 
}; 

class Route { 
public: 
    Route(string rnodes, double rrouteLength, int rtoursPerDay){} 
}; 

class RouteTaxi 
{ 
private: 
    int id; 
public: 
    Car car; 
    Route route; 
    RouteTaxi(string cbrand, string cmodel, int cyears, int 
     cseatingCapacity, double cloadCapacity, double cfuelConsumption, 
     string rnodes, double rrouteLength, int rtoursPerDay, int i) 
     : car(cbrand, cmodel, cyears, cseatingCapacity, cloadCapacity, cfuelConsumption), 
      route(rnodes, rrouteLength, rtoursPerDay), 
      id(i) 
    {} 
    static RouteTaxi generate_from_console_input(); 
}; 

// this is a factory function (class static member of RouteTaxi) 
RouteTaxi RouteTaxi::generate_from_console_input() { 
    // input from console 
    string cbrand, cmodel, rnodes; 
    int cyears, cseatingCapacity, rtoursPerDay, i; 
    double cloadCapacity, cfuelConsuption, rrouteLength; 

    // return the object 
    // this is an error, using uninitialized data, simply because I am not actually getting the data from the console. You will do that, so it will not be a problem. 
    return RouteTaxi(cbrand, cmodel, cyears, cseatingCapacity, cloadCapacity, cfuelConsuption, rnodes, rrouteLength, rtoursPerDay, i); 
} 

Beachten Sie die Doppelpunkt- und Initialisierungsliste, die der Konstruktor zum Initialisieren anderer Objekte verwendet, bevor er seinen eigenen Konstruktorhauptteil ausführt. http://en.cppreference.com/w/cpp/language/initializer_list

Der Fabrikgenerator ist eine andere Möglichkeit, Objekte zu erstellen. Sie benötigen alle Informationen, bevor Sie den eigentlichen Konstruktor aufrufen, also ... schreiben Sie eine Funktion, die es bekommt, bevor Sie den Konstruktor tatsächlich aufrufen.

Dies ist ein bekanntes Design-Muster. Siehe https://en.wikipedia.org/wiki/Creational_pattern. Obwohl diese viel detaillierter sind. Sie haben es nicht mit vielen verschiedenen Arten von RouteTaxi und Unterklassen zu tun.

+0

Danke. Ich habe diesen Konstruktor. Mein Problem ist, dass ich später möchte, dass mein Objekt von der Konsole aus berechnet und auf Fehler überprüft wird, ich möchte nicht, dass es statisch ist. Tut mir leid, wenn ich keinen Sinn mache. –

+0

Vielleicht möchten Sie eine Fabrik Generator-Funktion. Lass mich das hinzufügen. –

+0

Vielen Dank für Ihre Zeit! –