Как реализовать логические элементы в C ++ - PullRequest
2 голосов
/ 22 апреля 2019

Я самоучка на C ++ и занимаюсь разработкой управляющего программного обеспечения на этом языке программирования.Мой проект содержит среди прочего также класс C ++, который моделирует И вентиль с двумя входами.В какой-то момент я обнаружил, что было бы хорошо иметь логические элементы И с более чем двумя входами (максимум восемь входов).Мой вопрос заключается в том, как добиться этого наилучшим образом в 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;
}

- это унифицированный интерфейс для других логических элементов, таких как ИЛИ gate, RSтриггер и т. д.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Простое решение - создать класс, который имеет 8 входов со значениями по умолчанию; установка дополнительных входов на true для AND и false для OR приведет к тому, что неиспользуемые входы не окажут влияния на результат.

Например:

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() ;
1 голос
/ 23 апреля 2019

Я могу предложить использовать параметры по умолчанию

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...