C++-fout: geen overeenkomende constructor voor initialisatie van

Ik ben aan het oefenen met het toewijzen van leden in C++, waar je de waarden van het ene object kunt instellen op een ander object van dezelfde klasse. Het idee van het programma is om een rechthoekig object te initialiseren met enkele waarden en een ander rechthoekig object te maken, maar de waarde van het eerste toe te wijzen aan het tweede.

Het geeft me een foutmelding, die hieronder wordt gepost, en ik kan er niet achter komen wat het is en ik word er gek van lol

Dit is mijn Rectangle.h

#ifndef RECTANGLE_H
#define RECTANGLE_H
class Rectangle {
    private:
        double length;
        double width;
    public:
        Rectangle(double, double);
        double getLength() const;
        double getWidth() const;
};
Rectangle::Rectangle(double l, double w) {
    length = l;
    width = w;
}
double Rectangle::getWidth() const { return width; }
double Rectangle::getLength() const { return length; }
#endif

Dit is mijn Rectangle.cpp

#include <iostream>
#include "rectangle.h"
using namespace std;
int main()
{
    Rectangle box1(10.0, 10.0);
    Rectangle box2;
    cout << "box1's width and length: " << box1.getWidth() << ", " << box1.getLength() << endl;
    cout << "box2's width and length: " << box2.getWidth() << ", " << box2.getLength() << endl;
    box2 = box1;
    cout << "box1's width and length: " << box1.getWidth() << ", " << box1.getLength() << endl;
    cout << "box2's width and length: " << box2.getWidth() << ", " << box2.getLength() << endl;
    return 0;
}

Dit is de fout wanneer ik compileer.

skipper~/Desktop/Programming/Memberwise: g++ rectangle.cpp 
rectangle.cpp:7:12: error: no matching constructor for initialization of
      'Rectangle'
        Rectangle box1(10.0, 10.0);
                  ^    ~~~~~~~~~~
./rectangle.h:4:7: note: candidate constructor (the implicit copy constructor)
      not viable: requires 1 argument, but 2 were provided
class Rectangle {
  ^
./rectangle.h:4:7: note: candidate constructor
      (the implicit default constructor) not viable: requires 0 arguments, but 2
      were provided
1 error generated.

EDIT: Dit is hoe ik het kan laten werken. Ik heb alles in rechthoekige.cpp geplaatst en gaf de standaard argumenten van de constructeur.

bewerkte rechthoek.cpp

#include <iostream>
using namespace std;
class Rectangle {
     private:
         double length;
         double width;
    public:
        //Rectangle();
        Rectangle(double = 0.0, double = 0.0);
        double getLength() const;
        double getWidth() const;
 };
 int main()
 {
    Rectangle box1(10.0, 10.0);
    Rectangle box2;
    cout << "box1's width and length: " << box1.getWidth() << ", " << box1.getLength() << endl;
    cout << "box2's width and length: " << box2.getWidth() << ", " << box2.getLength() << endl;
    box2 = box1;
    cout << "box1's width and length: " << box1.getWidth() << ", " << box1.getLength() << endl;
    cout << "box2's width and length: " << box2.getWidth() << ", " << box2.getLength() << endl;
    return 0;
}
Rectangle::Rectangle(double l, double w) {
    length = l;
    width = w;
}
double Rectangle::getWidth() const { return width; }
double Rectangle::getLength() const { return length; }

De enige wijzigingen die ik heb aangebracht, waren het geven van standaardargumenten aan mijn door de gebruiker gedefinieerde constructor. Het was echter niet in staat om te werken wanneer de wijzigingen in rechthoek.h waren. Toen ik echter de klasse- en lidfunctiedefinities naar rechthoek.cpp verplaatste, kon het werken. Dus ik heb het programma aan het werk gekregen, maar ik heb het echte probleem niet aangepakt, namelijk wanneer de klasse- en lidfunctiedefinities rechthoekig zijn.h, het compileert niet.

Als iemand met dit probleem te maken heeft gehad en er een oplossing voor heeft gevonden, laat me dan weten hoe je het hebt gedaan. Bedankt 🙂


Antwoord 1, autoriteit 100%

In de rij

Rectangle box2; // no default constructor, error

je probeert de standaardconstructor van Rectangleaan te roepen. De compiler genereert niet meer zo’n standaardconstructor, omdat uw Rectangleeen door de gebruiker gedefinieerde constructor heeft die 2 parameters nodig heeft. Daarom moet u de parameters specificeren, zoals

Rectangle box2(0,10);

De foutmelding die ik krijg bij het compileren van uw code is:

Rectangle.cpp:8:15: fout: geen overeenkomende functie voor aanroep naar ‘Rectangle::Rectangle()’
Rechthoekig vak2;

Een oplossing is om een standaardconstructor te maken voor Rectangle, aangezien deze niet meer automatisch wordt gegenereerd vanwege uw door de gebruiker gedefinieerde:

Rectangle(); // in Rectangle.h
Rectangle::Rectangle(){} // in Rectangle.cpp (or Rectangle::Rectangle() = default; in C++11)

Een andere oplossing (en de voorkeur één, omdat het de gegevens niet-geïnitialiseerd niet verlaten) is om standaardargumenten aan uw bestaande constructor toe te wijzen.

Rectangle::Rectangle(double l = 0, double w = 0); // only in Rectangle.h

Op deze manier maakt u uw klasse standaard-constructible.


Antwoord 2, Autoriteit 8%

Er wordt alleen een compiler gegenereerde standaardconstructeur gegenereerd als u geen gedefinieerde constructeurs hebt. U definieert een constructor, dus als u een standaardconstructeur wilt, moet u het zelf geven. Waarschijnlijk is het gemakkelijkste (aantoonbaar) om het te verstrekken door de standaardargumenten te gebruiken in uw twee argumentaansluiting:

Rectangle(double l=0, double w=0)

Ook moet u de inlinetrefwoord gebruiken zoals hieronder wordt weergegeven of u kunt vinden dat u LINKER-fouten krijgt:

inline Rectangle::Rectangle(double l, double w) {
    length = l;
    width = w;
}
inline double Rectangle::getWidth() const { return width; }
inline double Rectangle::getLength() const { return length; }

Other episodes