【问题标题】:C++ Composition ConstructorC++ 组合构造函数
【发布时间】:2017-12-06 15:13:07
【问题描述】:

所以我有一个包含 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);

}

【问题讨论】:

    标签: c++ constructor setter composition


    【解决方案1】:

    您的构造函数 RouteTaxi() 是默认构造函数。它必须创建一个没有任何这些的有效对象,因此您必须具有可接受的默认值。

    没有创建默认路线的好方法,除非您有“无处”路线和“无车”汽车,因此您可以在构造函数中要求这些参数,如下例所示:

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

    【讨论】:

    • 谢谢。我有那个构造函数。我的问题是,稍后我希望我的对象从控制台估算并检查错误,我不希望它是静态的。对不起,如果我没有任何意义。
    • 也许你想要一个工厂生成器函数。让我补充一下。
    • 感谢您的宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多