簡體   English   中英

C ++復合構造函數

[英]C++ Composition Constructor

所以我有一個包含Car,Route和Taxi類的程序。 我正在使用組合以便從Car和Route類中獲取數據。 每個類都需要能夠自己輸入數據並輸入要檢查的數據。 我在如何使Taxi類的構造函數成為他使用和使用Car和Route類的get / set方法檢查數據的方式上遇到困難。 如何訪問setRouteTaxidata方法中的參數?

有什么建議么?

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

}

您的構造函數RouteTaxi()是默認構造函數。 它必須創建一個沒有任何對象的有效對象,因此您必須具有可接受的默認值。

除非您有一條帶有“ nocar”汽車的“ nowhere”路線,否則沒有默認路線的好方法,因此您可以在構造函數中要求使用這些參數,如以下示例所示:

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

請注意冒號和初始化程序列表,構造函數在執行其自己的構造函數主體之前將其用於初始化其他對象。 http://en.cppreference.com/w/cpp/language/initializer_list

工廠生成器是創建對象的另一種方法。 在調用實際的構造函數之前,您需要所有信息,因此...在實際調用構造函數之前,編寫一個獲取該信息的函數。

這是一種眾所周知的設計模式。 參見https://en.wikipedia.org/wiki/Creational_pattern 盡管這些細節很多。 您沒有處理很多不同類型的RouteTaxi和子類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM