如何在C ++中实现逻辑门

时间:2019-04-22 08:44:07

标签: c++11 embedded

我是使用C ++自学的,并且我一直在开发控制软件 这种编程语言。我的设计还包含一个C ++ 用两个输入对AND门建模的类。在某些时候,我发现具有两个以上输入(最多八个输入)的AND门就可以了。我的问题是如何最好地实现这一目标 C ++中的方式?

我一直在考虑类模板。是好主意还是使用合成,即AND_03由两个AND_02门组成?

class AND_02 : public Logic_FB{

private:

public:
void AND_02(uint32_t result, uint32_t input_01, uint32_t input_02);
void update(void);

} 

其中

class Logic_FB{
    virtual void update(void) = 0;
}

是其他逻辑元素(如“或”门,RS触发器等)的统一接口。

2 个答案:

答案 0 :(得分:1)

我可以建议使用默认参数

class AND_02
{
public:
    AND_02(bool x0, bool x1, bool x2 = true, bool x3 = true)
        : x0{x0}, x1{x1}, x2{x2}, x3{x3}
    {
    }

    bool result()
    {
        return x0 && x1 && x2 && x3;
    }

private:
    bool x0{false};
    bool x1{false};
    bool x2{false};
    bool x3{false};

    void update(void)
    {
        //do something
    }
};

您可以像使用它

    AND_02 andGateXY(false, true);
    AND_02 andGateXY2(true, true);
    std::cout << "Result: " << andGateXY.result();
    std::cout << "Result2: " << andGateXY2.result();
    if(andGateXY.result() && andGateXY2.result())
    {

    }
    std::cout << "Result2: " << (andGateXY.result() && andGateXY2.result());

答案 1 :(得分:0)

一个简单的解决方案是创建一个具有8个默认输入的类。对于AND,将可选输入设置为true,对于OR,将可选输入设置为false,将导致未使用的输入对结果没有影响。

例如:

class AND
{
    public:
        AND( bool x0 = false, bool x1 = false, // Required inputs
             bool x2 = true, bool x3 = true,   // Optional inputs
             bool x4 = true, bool x5 = true,
             bool x6 = true, bool x7 = true )
    {
        input( x0, x1, x2, x3, x4, x5, x7, x7 ) ;
    }

    bool output()
    {
        return m_x0 && m_x1 && m_x2 && m_x3 &&
               m_x4 && m_x5 && m_x6 && m_x5 ;
    }

    bool input( bool x0, bool x1,                // Required inputs
                bool x2 = true, bool x3 = true,  // Optional inputs
                bool x4 = true, bool x5 = true,
                bool x6 = true, bool x7 = true )
    {
        m_x0 = x0 ;
        m_x1 = x1 ;
        m_x2 = x2 ;
        m_x3 = x3 ;
        m_x4 = x4 ;
        m_x5 = x5 ;
        m_x6 = x6 ;
        m_x7 = x7 ;
        return output() ;
    } 

    private:
        bool m_x0, m_x1, m_x2, m_x3,
             m_x4, m_x5, m_x6, m_x7 ;
} ;

用法示例:

AND z;
bool out = z.input( a, b, c ) ;             // three input gate

AND z;
bool out = z.input( a, b, c, e, f, g ) ;    // six input gate

AND z( a,b,c,d ) ;        // Four inputs
bool out = x.output() ;