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个不同的派生类。因此,这意味着所有的条件语句都会从策略类转移到代码中的其他位置。知道我的意思吗?