c ++动态评估变量类型bool的值

时间:2018-01-31 16:16:50

标签: c++ boolean adventure

情况:我试图实现两个类,一个名为“特殊”的类。 special有一个成员变量bool conditions和一个方法perform_special。 另一个类名为manager,它具有类型为special的成员变量。仅当manager为真时,我才希望perform_special在其special成员上致电condition

到目前为止,我已经实现了这一段代码:

#include<iostream>
using namespace std;

class special{
  public:
    special(){};
    void perform_special();
    void set_conditions( bool cond );
    bool get_conditions();
  private:
    bool conditions;
};
void special::perform_special(){ cout<<"special performed."<<endl; }
void special::set_conditions( bool cond ){ conditions = cond; }
bool special::get_conditions(){ return conditions; }

class manager{
  public:
    manager(){};
    void check_specials();
    void set_effect( special* eff );
  private:
    special* effect;
};
void manager::check_specials(){
  if(effect->get_conditions()){ effect->perform_special(); }
}
void manager::set_effect( special *eff ){ effect = eff; }

int main(){
  int a=3; int b=2;
  bool cond = a<b;
  special effect1;
  effect1.set_conditions( cond );

  a=2; b=3;
  manager manager1;
  manager1.set_effect( &effect1 );
  manager1.check_specials();

  return 0;
}

这就是它的作用:它创建一个布尔cond,它立即被评估为false,因为此时a<b为假。现在它将这个条件赋给一个特殊的变量,它再次被赋予一个manager变量。当经理在其特殊变量上调用check_special时,没有任何反应,因为cond为假。

这是我的问题:我不希望立即评估cond。正如您在代码中看到的,a和be的值可能会更改,因此表达式a<b的值也会更改。我怎样才能实现cond的值仅在调用函数check_specials()并使用变量a和b的最新值时进行评估?

背景:我正在尝试实施基于文字的冒险游戏,所以特别是&#39;如果一系列条件成立,会发生某种特殊效果。 &#39;经理&#39;将是一种处理游戏并拥有所有特效等的大师班。我想在主函数中声明这些特效并将它们传递给变量游戏&#39;类型为manager然后启动游戏例程,因此我需要manager来动态评估特殊效果的条件表达式,因为条件会随着时间的推移而显着变化。

2 个答案:

答案 0 :(得分:2)

你可以构建一个Cond类,原型为:

struct Cond
{
    int& a;
    int& b;
    operator bool() const {return a < b;}
};

你用

实例化的
Cond cond{a, b};

代替您当前的cond声明。

然后您在测试点写if (cond),这会通过引用使用ab的当前值。

这是懒惰评估技术的熊骨头,但它只是一个开始。主要的缺陷是悬空引用的可能性,也许用std::reference_wrapper来解决。

答案 1 :(得分:1)

bool类型的变量传递给方法cond(),变量只能保存值。您需要传递的是一个函数,它返回bool

class special{
  public:
      using predicate = std::function<bool()>;

      void set_conditions( predicate p );
      ...
};

现在你可以传递一个函数,仿函数,lambda等,稍后将对其进行评估:

int main()
{
  int a=3; int b=2;
  auto cond = [&]{ return a<b; };
  special effect1;
  effect1.set_conditions( cond );
  ...
}