C++ 使用c++;“要控制的静态类成员”;“模式”;所有类实例的
这是一个简单的问题,但我想知道如何解决它。我有一个带有构造函数的C++ 使用c++;“要控制的静态类成员”;“模式”;所有类实例的,c++,class,constructor,static-members,C++,Class,Constructor,Static Members,这是一个简单的问题,但我想知道如何解决它。我有一个带有构造函数的Policy类Policy::Policy(const int&mode) 根据模式的值,策略对象可以具有不同的行为和特征。例如,假设运行我的程序有3种可能的模式,分别对应于模式=1、模式=2、和模式=3。现在,任何时候都不会有具有不同模式值的Policy对象 因此,对我来说,有一个变量static int Policy::MODE,这样所有Policy对象都知道应该在什么模式下运行。创建的第一个Policy对象将在其构造函数中设置
Policy
类Policy::Policy(const int&mode)
根据模式
的值,策略
对象可以具有不同的行为和特征。例如,假设运行我的程序有3种可能的模式,分别对应于模式=1
、模式=2
、和模式=3
。现在,任何时候都不会有具有不同模式值的Policy
对象
因此,对我来说,有一个变量static int Policy::MODE
,这样所有Policy
对象都知道应该在什么模式下运行。创建的第一个Policy
对象将在其构造函数中设置此静态类变量的值。然后,如果尝试创建任何其他策略
对象时使用模式
的不同的值,则实例化将以错误退出(因为这种情况永远不会发生)
对如何解决这个问题有什么建议吗
[下面添加了其他解释以回应评论请求。]
该计划旨在优化疾病筛查政策。每个Policy
对象代表一个筛选策略,并具有许多必要的功能,以便跟踪反映在人群中实施该策略的影响的统计数据。用最优化的说法,每个筛查策略都是一个决策变量向量,目标函数是通过使用疾病的自然史模型模拟策略来估计的
策略
对象需要能够无缝地适应多个复杂的优化框架。它不仅需要能够表示疾病筛查政策,还需要能够表示任何数量的标准测试问题,这些问题可以用来测试优化算法是否运行良好。根据策略
类的模式
值更改的特性/特征如下:(1)用于评估策略的仿真模型,(2)构造函数中设置决策变量向量长度等内容的代码,以及(3)用于显示有关给定策略及其估计性能的信息的代码
对于任何特定的仿真模型(即目标函数),都有多个“策略表达式”(即决策变量向量),可以将其解码为仿真模型所需的策略表达式。因此,每个“模式”代表一种表达筛选策略的方式与评估该策略的特定模拟模型的配对
撇开许多不相关的东西不谈,如果只有两种不同的运行模式,那么课程结构如下:
class Policy {
public:
vector<double> x; // encoded representation of a policy (decision variables)
explicit Policy(const int& mode) {
// set Policy::MODE if not already set (code not shown)
switch(MODE) {
case 1:
// code...
break;
case 2:
// code...
break;
}
}
void simulate() {
switch(MODE) {
case 1:
// code...
break;
case 2:
// code...
break;
}
}
void displayInfo() {
switch(MODE) {
case 1:
// code...
break;
case 2:
// code...
break;
}
}
private:
static int MODE;
};
类策略{
公众:
向量x;//策略的编码表示(决策变量)
显式策略(常量int和模式){
//设置策略::模式(如果尚未设置)(未显示代码)
开关(模式){
案例1:
//代码。。。
打破
案例2:
//代码。。。
打破
}
}
void模拟(){
开关(模式){
案例1:
//代码。。。
打破
案例2:
//代码。。。
打破
}
}
void displayInfo(){
开关(模式){
案例1:
//代码。。。
打破
案例2:
//代码。。。
打破
}
}
私人:
静态int模式;
};
在较高的层次上,您可以说每个模式值代表一个解决方案与一个估计器的配对。您是否要求这样的东西:
static int Policy::MODE=-1;
Policy::Policy(const int& mode) {
if (MODE==-1) {
MODE=mode;
}
else {
if (mode!=MODE) {
cout <<"mode mismatch "<<...<<endl;
exit (1); // or throw something, set some flags, depending on your needs
}
}
}
static int Policy::MODE=-1;
策略::策略(常量int和模式){
如果(模式==-1){
模式=模式;
}
否则{
如果(模式!=模式){
是的,没错。这正是我所想的。我很高兴看到其他人也发现这是一个好方法。设计听起来是错误的。每个类应该代表一件事,其中Policy
这里代表3。你能详细说明一下为什么要这样做吗?看起来应该是explicit Policy::Policy(常量整数和模式)
@AlexChamberlain我对我所做的做了一个解释。告诉我你是否有更好的设计建议。谢谢!是的,我有一个更好的建议;我明天会写出来,但本质上,这就是多态性的含义。为每种模式创建一个类,它是策略的派生并实现其方法。你可以有一个static工厂类,如果您愿意,它可以生成适当的策略。@AlexChamberlain太好了,非常感谢。我期待着您的评论。我以前从未在继承方面遇到过麻烦。这里可能是唯一的问题……在我的代码中创建策略对象的任何地方,我都必须使用条件语句来创建基于问题的“模式”,m个不同的派生类。因此,这意味着所有的条件语句都会从策略类转移到代码中的其他位置。知道我的意思吗?