gpt4 book ai didi

c++ - 程序选项

转载 作者:行者123 更新时间:2023-11-28 00:43:59 26 4
gpt4 key购买 nike

我正在使用 C++ 做一些算法工作。我的算法有一些选项,我需要尽可能少地添加到我的程序中。我目前正在使用 this代码。

一切都按预期工作:我在我的程序中添加了一些代码,因此我可以使用 -oopt1=val1,opt2=val2 等参数调用二进制文件,并且选项会自动设置。

问题是我同时也在写GUI。现在,每种选项都必须能够使用 GUI 进行设置/请求。但是,我可能需要一个用于整数值的旋转框和一个用于 bool 选项的复选框。我使用 Qt 作为工具包,所以我可以写一个成员返回 QWidget* 的函数,它是适当的基类。

但是,我不想在声明选项的 header 中使用任何特定于 GUI 的代码,因为我想将 GUI 与程序的其余部分分开。我可以将任何选项子类化以创建适当的 QWidget*,但是如果我得到 OptBase* 的列表,我将不知道应该创建哪种小部件。

有什么方法可以将 GUI 与程序的其余部分分开,同时仍然能够创建适当的小部件?

最佳答案

对我来说,解决方案是创建一个抽象工厂:工厂应该有一个带有两个抽象方法的接口(interface),分别是 createBoolOption 和 CreateChoiceOption。可能需要更多的方法然后,您可以对该接口(interface)进行两个具体实现,其中一个返回与您现在所做的相同的实现,但是当您在 QT 中运行时,您可以使用不同的实现,该实现返回一个知道如何创建小部件的 optbase 派生类.您甚至可以使用多重继承(即第二个接口(interface)),这样您就不必在第一个接口(interface)中创建方法来专门创建一个小部件。当然,在运行 QT 应用程序时,当您想要创建小部件时,您必须明确地转换到第二个界面。抽象工厂本身应该传递给 algobase 的构造函数。即依赖注入(inject)。

class ifactory{
public:
virtual Option<bool>* createBoolOption()=0;
virtual ChoiceOption<Mode>* createChoiceOption()=0;
virtual Widget* createWidget()=0; //here or in another interface
};

class ConcreteNonGuiFactory : public ifactory{
virtual Option<bool>* createBoolOption();
virtual ChoiceOption<Mode>* createChoiceOption();
virtual Widget* createWidget()={;};
};

class ConcreteGuiFactory : public ifactory{
virtual Option<bool>* createBoolOption();
virtual ChoiceOption<Mode>* createChoiceOption();
virtual Widget* createWidget();
};

class Algo1 : public AlgoBase{
public:
Algo1(ifactory& f):factory(f){
ChoiceOption<Mode>* opt = factory.createChoiceOption();
}
private:
ifactory factory;
}

如果小部件的创建是在不同的界面中,您可以减少依赖性。在此示例中,至少必须提前声明小部件。

关于c++ - 程序选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17300821/

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