情况:我试图实现两个类,一个名为“特殊”的类。 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
来动态评估特殊效果的条件表达式,因为条件会随着时间的推移而显着变化。
答案 0 :(得分:2)
你可以构建一个Cond
类,原型为:
struct Cond
{
int& a;
int& b;
operator bool() const {return a < b;}
};
你用
实例化的Cond cond{a, b};
代替您当前的cond
声明。
然后您在测试点写if (cond)
,这会通过引用使用a
和b
的当前值。
这是懒惰评估技术的熊骨头,但它只是一个开始。主要的缺陷是悬空引用的可能性,也许用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 );
...
}