将许多课程联系在一起

时间:2014-02-25 15:27:29

标签: c++ class design-patterns

嗯,我真的不知道什么标题会是最好的。所以,我正在尝试实现一个“布尔电路设计器”(不是作业,用于学习目的)。我从一个简单的例子开始:给定一个输入端口,输出端口,2根电线,一个电源和继电器。电路看起来像:

  • 输入端口连接到第一根电线
  • 输出端口iis连接到第二根电线
  • 第二根电线的另一端连接到电源
  • 2根导线中间连接有继电器

看起来像:

->in------------------------>
                         |
        power-----------relay----------out->

它只是否定输入位。我正在用C ++实现它,所以想要建立一个好的类层次结构。 如您所见,输入可以连接到电线,输出连接到电线,连接到继电器,以及更多变化。为此,我有一个空类port,这是所有电线,继电器等的基类。示例代码可能如下所示:

struct port {
    //nothing
};

struct power : public port {
    bool poweron = true;
};

struct relay : public port {
    port* input;
    bool on; //will depend on input wire's signal
};

struct wire : public port {
    port* input; //input end
    port* output; //output end
    std::vector<port*> outports; //output sockets for additional branching
    std::vector<port*> inports;  //input sockets for additional branching
};

struct bit_input : public port {
    port* output; //bit input can be vector too
};

struct bit_output : public port {
    port* input; //only one input bit to the bit output (lol)
};

int main(void)
{
    bit_input bin;
    bit_output bout;
    wire w0, w1;
    power p;
    relay r;

    ////////////////////////////////////////////////////////////////////////////////////////////////

    bin.output = &w0; //input wire connected to boolean input's output:    ->bin------->
    bout.input = &w1;  //output wire connected to boolean output's input:         ------->bout->

    w1.input = &p; //output wire's input end is set to the power supply        power------->bout->
    w1.output = &bout; //output wire's output end is set to the boolean output

    w0.input = &bin; //input wire's input end is set to the boolean input's output

    ////////////////////////////////////////////////////////////////////////////////////////////////

    w0.outports.push_back(&r); //one of input wire's output port is set to the relay;     ->bin---|--->
                                                                                    //          relay
                                                                                    //     power--|---->bout->
    w1.inports.push_back(&r); //relay is connected to one of output wire's inut ports too

    ////////////////////////////////////////////////////////////////////////////////////////////////

    r.input = &w0; //relay's input bit is set to input wire

    return 0;
};

这只是一个快速的代码,没有用于连接的接口。那么,是否有(当然有)更好的方式来做这种层次结构,有很多链接在一起。这只是一个例子,因为它仍然不处理信号,分支等......

主要问题是使用指针将部分链接在一起,因为为此我必须在解除引用指针时跟踪类型。所以我也可以使用void指针...我试图直接使用这些结构的指针,但必须制作模板,例如用于电线输入端的wire<power_supply, wire<whatever,whatever>>可以连接到电源,输出端连接到另一根电线。但是导线是一个模板,所以当我想连接多达1000根电线时,这并不能带来好处。如果超过2个类需要相互引用,我没有找到任何好的解决方案。

1 个答案:

答案 0 :(得分:2)

虽然我并不完全理解您的问题/问题,也不是问题领域。我猜你并不真正理解多态的概念。所以在这里举例说明这个概念。

input ----|  
power---relay1----|  
power----------relay2----Lamp 

现在看到这个图,它可能不是最好的,但它用来说明这个概念。所以我想在这里做的是使用relay1作为relay2的输入,这将使灯泡燃烧......就像那样

#include <iostream>

struct Component {
    virtual void calculate(){};
    bool state;
};

struct Relay : public Component {
    Component* input;
    Component* power;
    Component* output;

    void calculate() {
        bool inputOn = input->state;
        bool hasPower = power->state;
        if (inputOn && hasPower) {
            this->state = true;
        } else {
            this->state = false;
        }
        output->calculate();
    }
};

struct Lamp : public Component {
    Component* input;

    void calculate() {
        this->state = input->state;
    }
};

int main(){

    Component input;
    input.state = true;

    Component power;
    power.state = true;

    Lamp lamp;
    lamp.state = false;

    Relay relay1;
    Relay relay2;

    relay1.input = &input;
    relay1.power = &power;
    relay1.output = &relay2;
    relay1.state = false;

    relay2.input = &relay1;
    relay2.power = &power;
    relay2.output = &lamp;
    relay2.state = false;

    lamp.input = &relay2;
    lamp.state = false;

    relay1.calculate();

    std::cout << "Lamp state = " << lamp.state;

    return 0;
}

我试图在这里说明的是,继电器或灯中计算的实现不需要知道能够计算的连接组件的具体类型。因此,您不需要在声明/定义文件中包含它们,也不需要在添加新类型的组件后更改代码。

这是一个非常基本的实现,但我希望它有所帮助。