You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现命题逻辑公式类的多态运算符重载问题及方案

C++命题逻辑公式类运算符重载返回值异常解决

问题背景

尝试在C++类中编码实现命题逻辑对应的公式结构。
命题逻辑中的公式可分为三类:

  • 变量
  • 某个公式的否定式
  • 由连接词连接两个公式构成的复合公式

最初无法找到将三类不同结构定义到同一个类中的方法,因此将三者声明为同一基类下的不同子类。开发过程中遇到技术问题:自定义运算符未正确覆盖C++默认运算符行为,其中&&运算符的返回值为bool类型,而非预期的shared_ptr<formula>类型。

解决方案

在基类中维护指向自身类型的shared_ptr成员,避免对象切片问题,即可实现符合预期的运算符重载。完整实现代码如下:

#include <iostream>
#include <memory>

using namespace std;

// {0, 1, 2}
// {and, or, implies}

class formula
{
    shared_ptr<formula> F;

public:
    formula ()
    {}

    formula (shared_ptr<formula> f)
    {
        F = f;
    }

    formula (formula* f)
    {
        F = shared_ptr<formula> (f);
    }
    
    virtual bool evaluate ()
    {
        return F -> evaluate ();
    }

    virtual string type ()
    {
        return F -> type ();
    }

    shared_ptr<formula> address ()
    {
        return F;
    }

    virtual void assign (bool b)
    {
        F -> assign (b);
    }

    formula operator&& (formula f);
    formula operator|| (formula f);
    formula operator>> (formula f);
    formula operator! ();
};

class variable : public formula
{
    bool value;

public:
    void assign (bool b)
    {
        value = b;
    }
    
    bool evaluate ()
    {
        return value;
    }

    string type ()
    {
        return "variable";
    }
};

class negation : public formula
{
    shared_ptr<formula> arg;

public: 
    negation (formula f)
    {
        arg = f.address ();
    }

    bool evaluate ()
    {
        return !(arg -> evaluate ());
    }

    string type ()
    {
        return "negation";
    }
};

class connected : public formula
{
    shared_ptr<formula> lhs, rhs;
    int C;

public:
    connected (formula f, formula g, int c)
    {
        lhs = f.address ();
        rhs = g.address ();
        C = c;
    }

    bool evaluate ()
    {
        if (C == 0)
            return lhs -> evaluate () && rhs -> evaluate ();

        else if (C == 1)
            return lhs -> evaluate () || rhs -> evaluate ();

        else
            return !(lhs -> evaluate ()) || rhs -> evaluate ();
    }

    string type ()
    {
        return "connected";
    }
};

formula formula::operator&& (formula g)
{
    shared_ptr<formula> temp (new connected (*this, g, 0));
    formula f (temp);
    return f;
}

formula formula::operator|| (formula g)
{
    shared_ptr<formula> temp (new connected (*this, g, 1));
    formula f (temp);
    return f;
}

formula formula::operator>> (formula g)
{
    shared_ptr<formula> temp (new connected (*this, g, 2));
    formula f (temp);
    return f;
}

formula formula::operator! ()
{
    shared_ptr<formula> temp (new negation (*this));
    formula f (temp);
    return f;
}

int main ()
{
    formula A (new variable), B (new variable);

    A.assign(true);
    B.assign(false);

    formula x = A&&B, y = A||B, z = A>>B, w = !B;

    cout << boolalpha;
    cout << x.evaluate () << endl;
    cout << y.evaluate () << endl;
    cout << z.evaluate () << endl;
    cout << w.evaluate () << endl << endl;

    B.assign(true);
    cout << boolalpha;
    cout << x.evaluate () << endl;
    cout << y.evaluate () << endl;
    cout << z.evaluate () << endl;
    cout << w.evaluate () << endl;
}

内容的提问来源于stack exchange,提问作者O Grove

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:31:36