3 votes

"Erreur : aucune fonction correspondante pour l'appel à l'erreur de constructeur ".

J'essaie de construire un simulateur de circuit et je rencontre quelques erreurs avec l'héritage. Je pense que je suis simplement confus parce que je l'ai regardé pendant trop longtemps, donc j'apprécierais un peu d'aide.

message d'erreur :

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) {
                                                                      ^

Classe causant des problèmes :

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; 
}; 

Classe de porte binaire :

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

};

Gardez à l'esprit que le code fonctionnait avant que j'ajoute le deuxième constructeur pour wire qui prend un bool et un binary_gate.

J'ai déduit que l'erreur provient du second constructeur de la classe wire. Cela m'intrigue car il est très similaire au premier constructeur, tout ce que je fais est de passer une entrée bool, ce qui devrait être plus simple à coder !

Merci

2voto

JohnFilleau Points 3191

Votre wire a 4 variables membres. Chacune d'entre elles doit être construite lors de la construction d'une wire .

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

donne des instructions sur la manière de construire bit_output y gate_input mais pas bit_input y gate_output . Les constructeurs par défaut sont appelés pour ceux-ci. Mais vous n'avez pas de constructeur par défaut pour gate_input qui est de type binary_gate .

Déclarer un constructeur public par défaut pour binary_gate dans le binary_gate classe

binary_gate() = default;

ou

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

si vous voulez que la valeur par défaut binary_gate pour avoir d'autres valeurs spécifiques.

1voto

Adrian Mole Points 30581

Le problème est que votre deuxième constructeur pour l'objet wire classe :

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

est nécessaire pour appeler le Constructeur par défaut para binary_gate pour le gate_output ... et vous n'avez pas fourni de constructeur par défaut (c'est-à-dire sans argument). En effet, dès que vous fournissez un constructeur avec une signature différente (comme binary_gate(string s) ), le compilateur ne fournit plus de défaut implicite. Depuis Référence cpp (c'est moi qui souligne) :

Si aucun constructeur déclaré par l'utilisateur n'est fourni pour un type de classe (struct, class, ou union), le compilateur déclarera toujours un constructeur par défaut comme membre public inline de sa classe.

Cependant, votre autre constructeur pour le wire utilise la classe constructeur de copie pour les deux gate_input y gate_output et le compilateur fait fournir une valeur par défaut pour cela. Encore une fois, à partir de Référence cpp :

Si non des constructeurs de copie définis par l'utilisateur sont fournis pour une catégorie de classe (struct, class, ou union), le compilateur déclarera toujours un constructeur de copie comme un membre public inline non-explicite de sa classe.

Pour contourner ce problème, vous devez explicitement définir un constructeur par défaut (sans argument) ; la manière la plus simple est la suivante :

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.
    //...

N'hésitez pas à demander des précisions et/ou des explications supplémentaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X