我正在实现一个简单的逻辑和延迟模拟器。 为此,我必须创建2类,即节点和线,分别对网表的节点(门,输入和输出)以及节点之间的线进行建模。 节点对象拥有其输出导线 –如果删除节点对象,它也会删除其所有输出导线。电线连接两个节点,因此分别存储用于驱动节点和被驱动节点的指针。 导线对象不拥有它们连接的节点-不需要在销毁时删除节点。 为了测试所有这些,我需要实现完整的加法器。
下面是我编写的程序。
using namespace std;
class node
{
public:
bool a;
//node();
class wire
{
//Don't know what to declare here
}
};
bool evaluate (bool x, bool y, char o)
{
bool z;
if (o == '&')
z = x & y;
else if (o == '^')
z = x ^ y;
else if (o == '|')
z = x | y;
else
cout << "Error" << endl;
return z;
}
bool evaluate (bool x) //Function overloading
{
bool inv;
inv = !x;
return inv;
}
int main()
{
vector<node> input(3);
vector<node> output(2);
vector<node> intermediate(4);
cout << "Enter a, b and C_in \n";
cin >> input[0].a;
cin >> input[1].a;
cin >> input[2].a;
intermediate[0].a = evaluate(input[0].a, input[1].a, '^');
intermediate[1].a = evaluate (input[2].a, intermediate[0].a, '^');
output[0].a = intermediate[1].a;
intermediate[2].a = evaluate(intermediate[0].a, input[2].a, '&');
intermediate[3].a = evaluate(input[0].a, input[1].a, '&');
output[1].a = evaluate(intermediate[2].a, intermediate[3].a, '|');
cout << "Sum is "<< output[0].a<<endl;
cout << "Carry out is "<< output[1].a << endl;
return 0;
}
目前,我能够实现完整的加法器功能,但无需使用其他类导线。 我还需要在解决方案中包括其他类。 我该怎么办?
答案 0 :(得分:0)
如果我理解正确,那么您的节点代表一种存储电能(由布尔值表示)并通过电线连接到其他节点的东西,并且当完成两个节点之间的评估时,结果应发送到所有连接的节点。并且您已经实现了节点,但没有实现导线。
您可以向set_a
类添加一个方法(以下称其为node
)来修改其状态(布尔值),并向另一条线通知另一条线以调用set_a
它的连接节点。
更新:另外,您想修改evaluate
以使用节点而不是布尔值。这样,您就可以为问题提供更多面向对象的解决方案。
答案 1 :(得分:0)
根据您的规范,结构如下:
class Node
{
private:
std::vector<std::unique_ptr<Wire>> output;
std::vector<Wire*> inputs;
};
class Wire
{
private:
Node* from;
Node* to;
};
其中所有指针都是弱引用,除了Node
的输出之外,该输出保留所附加的Wire
实例的所有权。
由于结构紧密耦合,尽管您需要自己管理某些方面,例如:
Wire
应该同时清除from->output
和to->input
Node
应该循环其输入并取消绑定(以便Wire
附加一半,或者如果您的要求不允许,则应将它们全部删除)Node
将在其所有输出上调用Wire::~Wire()
,这将清除对绑定节点输入的所有引用。