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

程序选项 我用C++做了一些算法工作。我的算法有一些选项,我需要能够添加到我的程序尽可能少的努力。我目前正在使用代码,c++,qt,C++,Qt,一切都按预期进行:我向程序中添加了一些代码,这样我就可以使用参数调用二进制文件,如-oopt1=val1,opt2=val2,并自动设置选项 问题是我同时也在编写GUI。现在,必须能够使用GUI设置/请求各种选项。但是,我可能需要一个用于整数值的旋转框和一个用于布尔选项的复选框。我使用Qt作为工具包,所以我可以只编写一个成员 函数,该函数返回一个QWidget*,它是适当的基类 但是,我不希望在声明选项的标题中包含任何特定于GUI的代码,因为我希望将GUI与程序的其余部分分开。我可以将任何选项子

一切都按预期进行:我向程序中添加了一些代码,这样我就可以使用参数调用二进制文件,如
-oopt1=val1,opt2=val2
,并自动设置选项

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

但是,我不希望在声明选项的标题中包含任何特定于GUI的代码,因为我希望将GUI与程序的其余部分分开。我可以将任何选项子类化以创建适当的
QWidget*
,但是如果我得到
OptBase*
的列表,我就不知道应该创建什么样的小部件


是否有某种方法可以使GUI与程序的其余部分保持分离,同时仍然能够创建适当的小部件?

您需要一组变量,以供setter(GUI、commang line解析器)和getter(算法函数)访问。QV应该可以。由于选项有名称,它们也有隐式类型。Getter应该通过名称检索值,并显式地进行类型转换。二传手不应该在意——我会的

创建一个具有选项名称映射的单例实例。实现GUI值更改信号触发的插槽,在地图中设置值。 e、 g:

类变量表
{
static VarTable&instance(){static VarTable inst;return inst;}
QMap\u图;
公众:
void setVar(QString n,QVariant v){u-map[n]=v};
QVariant getVar(QString n)const{return_map[n];}
};
//由值更改信号触发的插槽调用(例如QEditLine::returnPressed)
VarTable::instance().setVal(“option1”,val1);
//非gui代码中的遗憾
QString option1=VarTable::instance().getVal(“option1”).toString();
问候


注意:我还没有编译代码,我有一些拼写错误。

您需要一组变量,可以由setter(GUI、commang行解析器)和getter(算法函数)访问。QV应该可以。由于选项有名称,它们也有隐式类型。Getter应该通过名称检索值,并显式地进行类型转换。二传手不应该在意——我会的

创建一个具有选项名称映射的单例实例。实现GUI值更改信号触发的插槽,在地图中设置值。 e、 g:

类变量表
{
static VarTable&instance(){static VarTable inst;return inst;}
QMap\u图;
公众:
void setVar(QString n,QVariant v){u-map[n]=v};
QVariant getVar(QString n)const{return_map[n];}
};
//由值更改信号触发的插槽调用(例如QEditLine::returnPressed)
VarTable::instance().setVal(“option1”,val1);
//非gui代码中的遗憾
QString option1=VarTable::instance().getVal(“option1”).toString();
问候


注:我没有编译代码,我有一些打字错误。

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

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;
}
类ifactory{
公众:
虚拟选项*createBoolOption()=0;
虚拟选项*createChoiceOption()=0;
虚拟小部件*createWidget()=0;//此处或其他界面中
};
工厂类别:公共工厂{
虚拟选项*createBoolOption();
虚拟选项*createChoiceOption();
虚拟小部件*createWidget()={;};
};
工厂类别:公共ifactory{
虚拟选项*createBoolOption();
虚拟选项*createChoiceOption();
虚拟小部件*createWidget();
}; 
类Algo1:公共AlgoBase{
公众:
Algo1(ifactory&f):工厂(f){
ChoiceOption*opt=factory.createChoiceOption();
}
私人:
工厂;
}
如果小部件的创建在不同的界面中,则可以减少依赖关系。
在本例中,至少必须向前声明小部件。

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

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;
}
类ifactory{
公众:
虚拟选项*createBoolOption()=0;
虚拟选择选项