我正在C++中开发一个逻辑模拟器。这是计算机工程课程的一个项目。该模拟器接收两个输入文件,电路描述和输入模式。电路描述包括输入和输出的数量以及门;例如:AND2 I1、I2、N1//是具有两个输入和节点N1作为输出的与门。我想用结构或列表来实现它,但我不知道如何连接所有节点,也不知道如何编写一个评估输出的函数。
您可以将门建模为具有输入并产生输出的类。例如:
class Gate
{
public:
virtual ~Gate() {}
virtual bool read() = 0;
};
class AndGate : public Gate
{
private:
Gate *m_Input1;
Gate *m_Input2;
public:
AndGate(Gate *input1, Gate *input2) : m_Input1(input1), m_Input2(input2)
{
}
bool read() override
{
return m_Input1->read() & m_Input2->read();
}
};
class OrGate : public Gate
{
private:
Gate *m_Input1;
Gate *m_Input2;
public:
OrGate(Gate *input1, Gate *input2) : m_Input1(input1), m_Input2(input2)
{
}
bool read() override
{
return m_Input1->read() | m_Input2->read();
}
};
class NotGate : public Gate
{
private:
Gate *m_Input;
public:
NotGate(Gate *input) : m_Input(input)
{
}
bool read() override
{
return !m_Input->read();
}
};
class ConstantLine : public Gate
{
private:
bool m_State;
public:
ConstantLine(bool state) : m_State(state)
{
}
bool read() override
{
return m_State;
}
};
这基本上给了你一个图形网络。你现在可以把闸门插在一起了。例如,要计算((X | Y) & !Z)
,您可以执行以下操作:
ConstantLine x(true);
ConstantLine y(false);
ConstantLine z(true);
NotGate notGate(&z);
OrGate orGate(&x, &y);
AndGate andGate(&orGate, ¬Gate);
bool result = andGate.read();
在您的解决方案中,您将动态创建门,因此不应使用原始指针,而应使用智能指针,如std::shared_pointer<Gate>
来管理门的输入。