c++ - 帮助解决这个问题(指针和多态性)

标签 c++ oop vector

这是我的问题。 我正在创建自己的 GUI Api。所有的小部件都在一个具有添加和删除功能的容器中。小部件派生自小部件基类。这是我不确定的地方。我理想情况下喜欢这样的流程: 用户创建一个(从基类派生的所需小部件)指针,容器分配和管理资源,用户有一个指向小部件的指针并可以调用它。

然而,多态性使这一点变得困惑。我怎样才能让我的容器创建正确类型的新容器?这里的问题是任何人都可以创建一个新的小部件(如 SuperTextBoxWidget),这就是为什么提供一个字符串并进行切换不能解决这个问题。

我的另一个快速修复方法是让用户负责执行新操作,并提供指向容器添加函数的指针。但这对我来说并不是白痴证明,让用户进行初始分配似乎很奇怪,但容器会管理其余部分,包括删除。

解决此问题的最佳和最简洁的方法是什么?

谢谢

只是我到目前为止的想法:

class AguiWidgetContainer
{

    std::vector<AguiWidgetBase*> widgets;
    public:
        AguiWidgetContainer(void);
        ~AguiWidgetContainer(void);
        void handleEvent(ALLEGRO_EVENT* event);
        int add(AguiWidgetBase *widget);
        bool remove(int widgetId);
};

最佳答案

我至少可以想到两种方法。

<强>1。提供add的模板版本:

template<class T>
int add() {
  widgets.push_back(new T);
}

<强>2。使用工厂类:

你可以有一个base factory class它定义了分配(也可能是免费的)小部件的方法。然后您的用户提供他们自己的工厂子类来创建正确类型的小部件。例如:

class AguiWidgetFactory {
  AguiWidgetBase *createWidget() = 0;
};

class AguiSuperWidgetFactory : public AguiWidgetFactory {
  AguiWidgetBase *createWidget() {
    return new SuperTextBoxWidget();
  }
};

然后您的 add 方法将一个工厂对象作为输入并使用它来创建一个新的小部件。

关于c++ - 帮助解决这个问题(指针和多态性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3868883/

相关文章:

c++ - Lambda 到函数指针适配器的理解

c++ - 在 Google Test 中打印 exception.what()

c++ - 试图使矩阵类工作

c# - 使用空父类只是对其他类进行分组。有更好的方法吗?

C# - 对象是否应该在更改状态等内容时负责创建历史对象?

c++ - 将 int[n][n] 转换为 vector <vector<int>>

C++ 将 int 追加到 wstring

php - 模仿 PHP 中的多重继承

c++ - 在字符串的VECTOR中记录特定子串出现的次数

c++ - 声明和访问在构造函数 c++ 中启动的二维 vector