Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将许多类链接在一起_C++_Class_Design Patterns - Fatal编程技术网

C++ 将许多类链接在一起

C++ 将许多类链接在一起,c++,class,design-patterns,C++,Class,Design Patterns,嗯,我真的不知道什么标题最好。所以,我试图实现一个“布尔电路设计器”(不是为了学习而做的家庭作业)。我从一个简单的例子开始:给定一个输入端口、输出端口、两根导线、一个电源和继电器。电路看起来像: 输入端口连接到第1条导线 输出端口iis连接到第二根导线 第二根导线的另一端连接到电源 2根导线在中间与继电器连接。 看起来像: ->in------------------------> | power---------

嗯,我真的不知道什么标题最好。所以,我试图实现一个“布尔电路设计器”(不是为了学习而做的家庭作业)。我从一个简单的例子开始:给定一个输入端口、输出端口、两根导线、一个电源和继电器。电路看起来像:

  • 输入端口连接到第1条导线
  • 输出端口iis连接到第二根导线
  • 第二根导线的另一端连接到电源
  • 2根导线在中间与继电器连接。
看起来像:

->in------------------------>
                         |
        power-----------relay----------out->
它只是对输入位求反。我在C++中实现它,所以想要创建一个好的类层次结构。 如您所见,可以将输入连接到导线,将输出连接到导线,将导线连接到继电器,以及更多变体。为此,我有一个空类
端口
,这是所有导线、继电器等的基类。示例代码可能如下所示:

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;
};
struct端口{
//没什么
};
结构电源:公共端口{
bool poweron=true;
};
结构中继:公共端口{
端口*输入;
bool on;//将取决于输入线的信号
};
结构线:公共端口{
端口*input;//输入结束
端口*output;//输出结束
std::vector outports;//用于其他分支的输出套接字
std::vector inports;//用于其他分支的输入套接字
};
结构位输入:公共端口{
端口*输出;//位输入也可以是向量
};
结构位输出:公共端口{
端口*input;//位输出(lol)只有一个输入位
};
内部主(空)
{
位输入箱;
位输出;
导线w0,w1;
功率p;
继电器r;
////////////////////////////////////////////////////////////////////////////////////////////////
bin.output=&w0;//连接到布尔输入输出的输入线:-->bin------>
bout.input=&w1;//连接到布尔输出输入的输出线:------->bout->
w1.input=&p;//输出线的输入端设置为电源供电------->bout->
w1.output=&bout;//输出导线的输出端设置为布尔输出
w0.input=&bin;//输入线的输入端设置为布尔输入的输出
////////////////////////////////////////////////////////////////////////////////////////////////
w0.outports.push|back(&r);//输入线的一个输出端口设置为继电器;->bin-->
//接力
//电源--|-->bout->
w1.inport.push_back(&r);//继电器也连接到输出线的一个inut端口
////////////////////////////////////////////////////////////////////////////////////////////////
r、 input=&w0;//继电器的输入位设置为input wire
返回0;
};
它只是一个快速的代码,没有用于连接的接口。那么,有没有(当然有)更好的方法来实现这种层次结构,有很多链接到一起。这只是一个例子,因为它仍然不能处理信号、分支等等


主要问题是使用指针将部分链接在一起,因为为此,在取消引用指针时,我必须跟踪类型。所以我也可以用空指针来做这个。。。我尝试直接使用指向这些结构的指针,但必须制作模板,例如,导线输入端可以连接到电源,输出端可以连接到另一根导线。但wire是一个模板,所以当我想连接多达1000条电线时,这并不能带来好的结果。如果有两个以上的类需要相互引用,我还没有找到任何好的解决方案。

但我并不完全理解您的问题,也不完全理解问题域。我猜你并不真正理解多态性的概念。因此,这里用一个例子来说明这个概念

input ----|  
power---relay1----|  
power----------relay2----Lamp 
现在看这个图表,它可能不是最好的,但它是用来说明这个概念的。因此,我想在这里使用继电器1作为继电器2的输入,这将使灯点亮。。诸如此类

#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;
}
#包括
结构组件{
虚空计算(){};
布尔州;
};
结构中继:公共组件{
组件*输入;
组件*功率;
组件*输出;
无效计算(){
布尔输入按钮=输入->状态;
bool hasPower=电源->状态;
if(输入和输出电源){
此->状态=真;
}否则{
该->状态=假;
}
输出->计算();
}
};
结构灯:公共组件{
组件*输入;
无效计算(){
此->状态=输入->状态;
}
};
int main(){
分量输入;
input.state=true;
分量功率;
power.state=true;
灯;
lamp.state=false;
继电器1;
继电器2;
relay1.input=&input;
relay1.power=&power;
relay1.output=&relay2;
relay1.state=false;
relay2.input=&relay1;
relay2.power=&power;
relay2.output=&灯;
relay2.state=false;
lamp.input=&relay2;
lamp.state=false;
关系1.计算();

std::虽然我并不真正了解/理解问题域,但在我看来,您不需要对电线本身进行建模。每个组件都有指向连接到它的其他组件的指针,通过该指针,它可以从这些连接的组件获取信息。为了获取该信息,我可能会尝试使用连接的组件可以调用的多变形/虚函数,从而尝试消除对解引用指针的确切类型的需要更多类的问题是这样的。我事先不知道哪个类将链接到哪个类。布尔电路就是一个例子,我之前也遇到过这个问题帮助!我只是把问题复杂化了一点。那个“递归”计算函数是