gpt4 book ai didi

c++ - 如何在 C++ 中优雅地处理抽象工厂和数组作为返回类型?

转载 作者:太空狗 更新时间:2023-10-29 21:27:46 25 4
gpt4 key购买 nike

考虑到抽象工厂模式,假设您有一个 class hierarchy具体工厂覆盖 createButton*s* 虚拟方法,需要返回更广泛的按钮数组。解决这个问题的优雅解决方法是什么,因为 C++ 仅支持协变返回类型? dynamic_cast?

GoF 示例的修改版本以满足我的要求:

class Button {
public:
virtual void paint() = 0;
virtual ~Button(){
}
};

class WinButton: public Button {
public:
void paint() {
cout << "I'm a WinButton";
}
};

class OSXButton: public Button {
public:
void paint() {
cout << "I'm an OSXButton";
}
};

class GUIFactory {
public:
virtual Button * createButtons() = 0;
virtual ~GUIFactory(){
}
};

class WinFactory: public GUIFactory {
public:
WinButton* createButtons() {
return new WinButton[2];
}

~WinFactory(){
}
};

class OSXFactory: public GUIFactory {
public:
OSXButton* createButtons() {
return new OSXButton[2];
}

~OSXFactory(){
}
};

以及应用程序框架:

Application(GUIFactory * factory) {
Button* buttons = factory->createButtons();
for(...) {...}
}

最佳答案

这是不可能的。问问自己,来电者会不会deletedelete[]它?他们如何知道数组中有多少个元素?没有办法用原始指针返回来解决这些问题中的任何一个。所以对你的问题的简单回答是,这是不可能的,你也不应该这样做。被调用者需要知道返回类型 - 是一个按钮还是多个按钮,以及完成后如何清理它们。

如果不调用未定义行为,您甚至无法访问非第一个元素。

工厂应该构造单个对象。如果需要多个,请多次调用工厂函数。

即使您神奇地拥有可以同时处理多个按钮的代码,而他们只需要一个按钮(wtf?),您也需要安全地返回多个按钮。这意味着 std::vector<smart_pointer<Button>> .

关于c++ - 如何在 C++ 中优雅地处理抽象工厂和数组作为返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8615238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com