C++ 合成构造函数

C++ Composition Constructor

所以我有一个包含 classes 汽车、路线和出租车的程序。我正在使用组合来从 classes 汽车和路线中获取数据。每个 class 都需要能够自己输入数据,并且输入的数据要经过检查。我在如何按照他使用的方式制作 Taxi class 的构造函数时遇到困难,并使用 classes 汽车和路线的 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() 是默认构造函数。它必须创建一个没有任何这些的有效对象,因此您必须具有可接受的默认值。

除非您有 "nowhere" 路线和 "nocar" 汽车,否则没有创建默认路线的好方法,因此您可以改为在构造函数中要求这些参数,如本例所示:

#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 和子类。