2017-04-06 3 views
1

Der Code wird nicht kompiliert. Ich verstehe nicht, was der Fehler ist, bitte helfen)C++ - Code kompiliert nicht

#include <iostream> 
#include <fstream> 

class Record{ 
    std::string product_name; 
    std::string product_category; 
    int price; 
    int amount; 
public: 
Record(std::string newName, std::string newCategory, int newPrice, int newAmount){ 
    product_name=newName; 
    product_category=newCategory; 
    price=newPrice; 
    amount=newAmount; 
} 

    std::string getName(){ 
     return product_name; 
    } 
    std::string getCategory(){ 
     return product_category; 
    } 
    int getPrice(){ 
     return price; 
    } 
    int getAmount(){ 
     return amount; 
    } 
    void setName(std::string newName){ 
     product_name=newName; 
    } 
    void setCategory(std::string newCategory){ 
     product_category=newCategory; 
    } 
    void setPrice(int newPrice){ 
     price=newPrice; 
    } 
    void setAmount(int newAmount){ 
     amount=newAmount; 
    } 
}; 

int main(){ 
    Record r1; 
    r1.setName("beer"); 
    r1.setCategory("alcohol"); 
    r1.setPrice(12); 
    r1.setAmount(32); 
    Record r2("carrot", "vegetables", 123, 1932); 
    std::cout<<r1.getName()<<" "<<r1.getCategory()<<" "<<r1.getPrice()<<" "<<r1.getAmount()<< std::endl; 
    std::cout<<r2.getName()<<" "<<r2.getCategory()<<" "<<r2.getPrice()<<" "<<r2.getAmount()<< std::endl; 
    Record r3[2]; 
    std::string a; 
    float b; 
    unsigned int c; 
    for(unsigned int i=0; i<2; ++i){ 
     std::cout<<"input name: "; 
     std::cin>>a; 
     r3[i].setName(a); 
     std::cout<<"input category: "; 
     std::cin>>a; 
     r3[i].setCategory(a); 
     std::cout<<"input price: "; 
     std::cin>>b; 
     r3[i].setPrice(b); 
     std::cout<<"input amount: "; 
     std::cin>>c; 
     r3[i].setAmount(c); 
    } 
    for(unsigned int i=0; i<2; ++i){ 
     std::cout<<r3[i].getName()<<" "<<r3[i].getCategory()<<" "<<r3[i].getPrice()<<" "<<r3[i].getAmount()<< std::endl; 

    } 

    return 0; 

} 

Error text: g++ -Wall -c "main.cpp" (/media/ad/4GB-NTFS/prog/laba2) main.cpp: In function ‘int main()’: main.cpp:46:12: error: no matching function for call to ‘Record::Record()’ Record r1; ^ main.cpp:12:1: note: candidate: Record::Record(std::__cxx11::string, std::__cxx11::string, int, int) Record(std::string newName, std::string newCategory, int newPrice, int newAmount){ ^ main.cpp:12:1: note: candidate expects 4 arguments, 0 provided main.cpp:6:7: note: candidate: Record::Record(const Record&) class Record{ ^ main.cpp:6:7: note: candidate expects 1 argument, 0 provided main.cpp:54:16: error: no matching function for call to ‘Record::Record()’ Record r3[2]; ^ main.cpp:12:1: note: candidate: Record::Record(std::__cxx11::string, std::__cxx11::string, int, int) Record(std::string newName, std::string newCategory, int newPrice, int newAmount){ ^ main.cpp:12:1: note: candidate expects 4 arguments, 0 provided main.cpp:6:7: note: candidate: Record::Record(const Record&) class Record{ ^ main.cpp:6:7: note: candidate expects 1 argument, 0 provided

+1

Beachten Sie die Wörter unmittelbar nach "Fehler": 'keine übereinstimmende Funktion für den Aufruf von 'Record :: Record()'' –

Antwort

0

Sie haben den Konstruktor Ihrer Klasse außer Kraft gesetzt, und so ist es nicht eine, die Null-Argumente, da dies erfordert akzeptiert:

Record r1; 

einen Standardkonstruktor definieren:

Record() {} 
+0

In welchem ​​definierten Zustand platziert dieser Konstruktor das konstruierte Objekt? –

+0

Ich glaube, dass jedes Datenelement des Datensatzobjekts zugewiesen wird und der Standardkonstruktor jedes Datenelements aufgerufen wird. –

2

Ihre Klasse keinen Standardkonstruktor hat. Also, wenn Sie sagen:

Record r1; 

der Compiler nicht weiß, wie das r1 Objekt zu erstellen. Sie müssen entweder alle Parameter liefern, wenn r erstellt:

Record r1("foo", "bar", 1, 2); 

oder besser ganz die Gestaltung des Programms überdenken.

-1

main.cpp:46:12: error: no matching function for call to ‘Record::Record()’

That ist, an dieser Stelle:

Record r1; 

Sie versuchen, das Objekt r1 mit einem Standardkonstruktor (Record::Record) zu instanziieren. Tatsächlich liefern Sie keine Parameter.

Darüber hinaus ist die Compiler weiter:

note: candidate expects 4 arguments, 0 provided

Nach Ihrer Klasse Schnittstelle, der einzige Weg, ein Record Objekt zu instanziiert ist der einzige Konstruktor zu nutzen, das heißt:

Record(std::string, std::string, int, int); 

Wenn Sie möchten, dass ein Record Objekt mit einem Standardkonstruktor instanziiert wird, den Sie bereitstellen müssen.

C++ 11 können Sie schreiben:

Record() = default; 

Um ein Standard-Konstruktor zu definieren.

+0

Ein Standardkonstruktor macht selten Sinn - in diesem Fall ist es schwer zu sehen, wie ein standardmäßig konstruiertes Objekt nützlich wäre. –

+0

@NeilButterworth Wenn der Standardkonstruktor keinen Sinn ergibt, hätte der moderne Standard kein neues Schlüsselwort definiert, um es explizit zu generieren. –

0

Sie müssen einen Konstruktor ohne Parameter definieren.

Record r1 versucht, Record() aufzurufen, aber es findet es nicht. Fügen Sie einfach den zusätzlichen Konstruktor in Ihre Klasse ein. Es kann leer sein. Dies löst auch das gleiche Problem mit Record r3[2].



P.S. (nicht verwandt mit der Frage, aber hilfreich)

Mit Blick auf Ihren Code, schlage ich vor, Sie überprüfen member initializer lists für die Implementierung Ihrer Konstruktoren. Warum? Siehe here.