Factory method creating shared_ptr object
当使用工厂创建一个对象时,例如在下面的示例中,在某些情况下,由
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | class Link { private: std::shared_ptr<xs::CrossSection> xs; public: void parseXsection(const std::vector<std::string>& parts); std::shared_ptr<xs::CrossSection> getXs() { return this->xs; } }; void Link::parseXsection(const std::vector<std::string>& parts) { this->xs = xs::Factory::create(parts[1]); } namespace xs { class CrossSection { }; class Circular : public CrossSection { }; class Dummy : public CrossSection { }; class Factory { public: static std::shared_ptr<CrossSection> create(const std::string& type); }; std::shared_ptr<CrossSection> Factory::create(const std::string& type) { if (geom =="circular") { return std::shared_ptr<CrossSection>(new Circular()); } else { return std::shared_ptr<CrossSection>(new Dummy()); } } } |
所以,马丁有一个解决析构函数问题的选项。可以添加虚拟析构函数。
但是,因为您使用的是
1 2 3 4 5 6 7 | std::shared_ptr<CrossSection> Factory::create(const std::string& type) { if (geom =="circular") return std::shared_ptr<Circular>(new Circular()); else return std::shared_ptr<Dummy>(new Dummy()); } |
或者,更好的是:
1 2 3 4 5 6 7 | std::shared_ptr<CrossSection> Factory::create(const std::string& type) { if (geom =="circular") return std::make_shared<Circular>(); else return std::make_shared<Dummy>(); } |
为了使用多态性,您肯定需要在
1 2 3 4 | class CrossSection { public: virtual ~CrossSection() { /* Nothing to do here ... */ } }; |
例如,什么时候使用虚拟析构函数?或者每个类都应该有一个虚拟析构函数?更多解释。
附言:我现在不能说,如果这是你和