2014-02-25 24 views
0

嗯,我真的不知道什麼標題會是最好的。所以,我試圖實現一個'布爾電路設計器'(不是作業,用於學習目的)。我從一個簡單的例子開始:給定一個輸入端口,輸出端口,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根電線時,這不會帶來好的結果。如果有兩個以上的課程需要彼此參考,我還沒有找到任何好的解決方案。

+0

儘管我並不真正瞭解/理解問題域,但在我看來,您並不需要自己對線進行建模。每個組件都有指向連接到它的其他組件的指針,並且通過該指針可以從這些連接的組件獲取信息。爲了得到這些信息,我可能會嘗試使用連接組件可以調用的多態/虛函數,從而儘量避免知道提取指針的確切類型的需要。 –

+0

問題就像這樣用更多的類http:// stackoverflow的.com /問題/ 5493745/C聯-2-類在一起-如何。我不知道哪一堂課會和哪一堂課有聯繫。布爾電路就是一個例子,我之前也遇到過這個問題。 –

回答

2

雖然我完全不瞭解您的問題/問題,也沒有問題域。我猜你沒有真正理解多態的概念。所以這裏舉一個例子來說明這個概念。

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

看到這個圖現在,它可能不是最好的,但它來說明這個概念。所以我想在這裏做的是利用繼電器1輸入到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; 
} 

我嘗試在這裏說明的是,計算在繼電器或燈的實現不需要了解能夠計算的連接組件的具體類型。因此,當您添加新類型的組件時,您不需要將它們包含在其聲明/定義文件中,也不需要更改代碼。

這是一個非常基本的實現,但我希望它有幫助。

+0

幫助!我只是有點太複雜的問題。這個'遞歸'計算函數很好。:) –

+1

這基本上是一個類似樹的結構,遞歸遍歷它被認爲是更自然的方式;)http://en.wikipedia.org/wiki/Tree_traversal#Types –

相關問題