【问题标题】:C++, Adding conditions in class varsC++,在类变量中添加条件
【发布时间】:2015-03-04 12:03:27
【问题描述】:

标题可能不正确,因为我找不到合适的词。 我想为某个对象(类创建的实例)添加条件。

在 obj.h 中:(不包括预处理器命令)

    class obj {
    public:
            void addCondition( bool cond );
            void useCondition();
    private:
            bool conditions;
    };

在 obj.cpp 中:(不包括预处理器命令)

    void obj::addCondition( bool cond )
    {
            //What to write here, is the question in short!!!
    }

    void obj::useCondition()
    {
            if(conditions)
            {
              //Do something...
            }
    }

假设条件是: 条件 = 值 1 > 值 2; 我想在条件中“添加”一个条件,使它变成这样:

    conditions = (value1 > value2) || (value3 <= value4);

    conditions = (value 1 > value2) && (value3 <= value4);

如果我问的东西有问题,我很抱歉!如果您知道答案以外的其他东西,但做同样事情的完全不同的事情,不要犹豫,讨论它。

提前致谢!

【问题讨论】:

  • 听起来像是 lambdas 和 std::function&lt;bool()&gt; 的工作?
  • @cdhowie 你能解释一下什么是 lambdas 和 std::function 吗?看起来像 C++11 的东西。
  • 这是一个 C++11 的东西。你可以在 C++03 中做同样的事情,但语法要冗长得多。
  • 不管它是什么!给我一个关于这两种方法的正确解释:C++11 lambda 和 C++03 冗长语法。
  • 我可以,但首先你能澄清一下value1value4 的值是从哪里来的吗?它们是数据成员、全局变量、函数参数还是什么?谁供应它们?

标签: c++ class object conditional-statements


【解决方案1】:

我假设您知道为什么conditions 字段和condition 参数都是简单的布尔变量。如果这是真的,它可能非常简单,但你应该将 addCondition 替换为 andConditionorCondition

void obj::andCondition( bool cond )
{
        conditions = conditions && condition;
}
void obj::orCondition( bool cond )
{
        conditions = conditions || condition;
}

您应该定义条件最初是真还是假。您始终可以将其设置为定义的值,因为上面的代码:

obj.andCondition(false);

conditions 设置为假,并且

obj.orCondition(true);

conditions 设置为真


按 cmets 编辑:

上面的答案是基于conditions是一个简单的布尔变量,condition是一个简单的布尔值的要求。

如果您想重新评估条件,这里是一个示例。

一个类 and-ing (resp. or-ing) 由在使用 useCondition 时评估的布尔变量表示的条件:

class andcond {
    std::list<bool *> conditions;

public:
    void addCondition(bool &condition) {
        conditions.push_back(&condition);
    }
    bool isCondition();
};

bool andcond::isCondition() {
    bool retval = true;
    for (std::list<bool *>::iterator it = conditions.begin(); it != conditions.end(); it++) {
        retval = retval && **it;
    }
    return retval;
}

int main() {
    bool a=false, b=true;
    andcond c;
    c.addCondition(a);
    c.addCondition(b);
    std::cout << c.isCondition() << std::endl;  // is false here

    a = true;
    std::cout << c.isCondition() << std::endl; // is true here

    return 0;
}

注意:conditions 是指向可以重新计算的布尔变量的指针列表

您甚至可以通过定义实现bool eval() 方法的条件类的完整层次结构来更通用,例如两个变量之间的相等或不相等,并且可以通过andor 组合。但是对于SO的初步答案来说,这太复杂了。但是您可以尝试实现这个想法并在卡住时在这里提出更精确的问题...

【讨论】:

  • 谢谢!没有 lambda,没有冗长的语法!我不敢相信事情就这么简单。数据成员的初始值应始终通过构造函数设置!但无论如何,你的答案看起来不错。
  • @user3820248 啊,如果就这么简单,那就太好了。我的印象是,在调用 useCondition() 时需要重新评估条件,这需要仿函数。
  • 重新评估!我不明白!
  • @cdhowie 无论他回答什么,都无所谓!我正在等待您的回答,因为我相信它会比那更好!
  • @user3820248:你能说一下问题是什么吗?你能给出真实的使用例子吗? cdhowie 和我从你的问题中不明白同样的事情,所以你可能应该试着更清楚
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 2015-08-22
  • 1970-01-01
相关资源
最近更新 更多