"ошибка: нет подходящей функции для вызова" - PullRequest
3 голосов
/ 25 февраля 2020

Я пытаюсь построить симулятор цепи и сталкиваюсь с ошибками с наследованием. Я думаю, что я просто сбит с толку, потому что я смотрел на это слишком долго, поэтому был бы признателен за помощь.

сообщение об ошибке:

prep_3.cpp: In constructor 'wire::wire(bool&, binary_gate&)':
prep_3.cpp:147:70: error: no matching function for call to 'binary_gate::binary_gate()'
   wire(bool &from, binary_gate &to) : bit_output(from), gate_input(to) {
                                                                      ^

Класс, вызывающий проблемы:

class wire{
    public : 
        wire(binary_gate &from, binary_gate &to) : gate_output(from), gate_input(to) {
            //want to pass output of from into to.
            //therefore must set_next_bit of to taking the input as the output of from
            to.set_next_bit(from.get_output()); 
        }

        wire(bool &from, binary_gate &to) : bit_output(from), gate_input(to) {
            to.set_next_bit(from); 
        }

    private : 
        binary_gate gate_output, gate_input; 
        bool bit_output, bit_input; 
}; 

Класс двоичного вентиля:

class binary_gate : public logic_element{
    public : 
    binary_gate(string s) : logic_element(s), bitA_status(false), bitB_status(false){}; 

    bool get_bitA(){
        if(!bitA_status){
            cout << "A hasn't been assigned yet! please set it : " ; 
            cin >> bitA; 
            bitA_status = true; 
        }
        return bitA; 
    }

    bool get_bitB(){
        if(!bitB_status){
            cout << "B hasn't been assigned yet! please set it : " ; 
            cin >> bitB; 
            bitB_status = true; 
        }
        return bitB; 
    }

    void set_bitA(bool val){
        bitA = val; 
        bitA_status = true; 
    }

    void set_bitB(bool val){
        bitB = val; 
        bitB_status = true; 
    }

    bool get_statusA(){
        return bitA_status; 
    }


    bool get_statusB(){
        return bitB_status; 
    }

    virtual void set_next_bit(bool from_bit){ 
        if(!bitA_status){ 
            bitA = from_bit;
            this->bitA_status = true; 
        }
        else if(!bitB_status){ 
            bitB = from_bit; 
            this->bitB_status = true;           
        }
    }

    protected: 
        bool bitA;
        bool bitB; 
        bool bitA_status; // true = taken, false = empty
        bool bitB_status; // true = taken, false = empty

};

Имейте в виду, что код был работая до того, как я добавил второй конструктор для wire, который принимает bool и binary_gate.

Я сделал вывод, что ошибка происходит от второго конструктора в классе проводов. Это озадачивает меня, так как он очень похож на первый конструктор, все, что я делаю, это передаю ввод bool, который, возможно, должен быть более простым для кодирования!

Спасибо

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Ваш wire класс имеет 4 переменных-члена. Каждый из них должен быть построен во время построения wire.

wire(bool &from, binary_gate &to) : bit_output(from), gate_input(to)

дает инструкции о том, как построить bit_output и gate_input, но не bit_input и gate_output. Для этого вызываются конструкторы по умолчанию. Но у вас нет конструктора по умолчанию для gate_input, который имеет тип binary_gate.

Объявите общедоступный c конструктор по умолчанию для binary_gate в binary_gate классе

binary_gate() = default;

или

binary_gate() : ...initialization list... {}

, если вы хотите, чтобы по умолчанию binary_gate имел другие заданные значения c.

1 голос
/ 25 февраля 2020

Проблема в том, что ваш второй конструктор для класса wire:

wire(bool &from, binary_gate &to) : bit_output(from), gate_input(to) {
    to.set_next_bit(from); 
}

требуется для вызова конструктора по умолчанию для binary_gate, для члена gate_output ... и вы не предоставили конструктор по умолчанию (т.е. без аргумента). Это связано с тем, что после предоставления конструктору другой подписи (например, binary_gate(string s)) компилятор больше не предоставляет неявное значение по умолчанию. От cppreference (выделение жирным шрифтом):

Если не предоставлено никаких пользовательских конструкторов любого типа для типа класса (структура, класс или объединение) ), компилятор всегда объявляет конструктор по умолчанию как встроенный элемент publi c своего класса.

Однако ваш другой конструктор для класса wire использует конструктор копирования для gate_input и gate_output, и компилятор не обеспечивает по умолчанию для этого. Опять же, из cppreference :

Если нет пользовательских конструкторов копирования для типа класса (struct, class или union), компилятор всегда объявляет конструктор копирования как неявный встроенный член publi c своего класса.

Чтобы обойти это, вам нужно явно установить конструктор по умолчанию ( без аргументов); Самый простой способ заключается в следующем:

class binary_gate : public logic_element{
    public : 
    binary_gate(string s) : logic_element(s), bitA_status(false), bitB_status(false){}; 
    binary_gate() = default; // Provide an *explicit* default constructor.
    //...

Не стесняйтесь просить дальнейших разъяснений и / или объяснений.

...