2017-01-25 5 views
-4

Ich arbeite an einer Vererbung Aufgabe und wollte zunächst meine Basisklasse mit seinen Setter & Getters & Konstruktoren testen, aber ich bin schon an einer Wand. Was ist los mit meinem Konstruktor? Ich würde normalerweise nur einen Konstruktor ohne Argumente verwenden und die Setter und Getter verwenden, um das Objekt zu erstellen, aber wir werden ausdrücklich angewiesen, beide Arten von Konstruktoren zu verwenden. Kann mir jemand helfen?C++ Typ bietet keinen Anruf Operator Fehler?

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <string> 
using namespace std; 

class Ship 
{ 
public: 
    Ship(); 
    Ship(string theName, int theYear); 
    string getName(); 
    void setName(string); 
    int getYear(); 
    void setYear(int); 
    void printInfo(); 

    private: 
    string name; 
    int yearBuilt;  
}; 

Ship:: Ship() 
{ 
    name = ""; 
    yearBuilt = 0; 
} 

Ship:: Ship(string theName, int theYear) 
{ 
    name = theName; 
    yearBuilt = theYear; 
} 

string Ship::getName() 
{ 
    return name; 
} 

void Ship::setName(string newName) 
{ 
    name = newName; 
} 

int Ship:: getYear() 
{ 
    return yearBuilt; 
} 

void Ship:: setYear(int newYear) 
{ 
    yearBuilt = newYear; 
} 

void Ship:: printInfo() 
{ 
    cout << "Name: " << name << endl; 
    cout << "Year built: " << yearBuilt << endl; 
} 

int main() 
{ 
    Ship lilCutie; 
    lilCutie("Boat", 1993); 
    lilCutie.printInfo(); 

    return 0; 
} 
+1

Ich denke, Sie wollen 'Schiff lilCutie (" Boat ", 1993);'. – songyuanyao

+0

Ja, das ist die Zeile, die den Fehler wirft. – jestrada

+0

Oh mein Gott, ich sehe was du sagst. Ich denke, ich habe keine Argument Konstruktoren zu lange haha. Danke!!!!!! – jestrada

Antwort

1

Sie können ohne Parameter Konstruktor aufrufen, dann Setter verwenden Wert zu setzen:

Ship lilCutie; 
lilCutie.setName("Boat"); 
lilCutie.setYear(1993); 

Sie können auch durch den Aufruf Konstruktor mit Parametern tun:

Ship lilCutie("Boat", 1993); 
1

Es ist der Hauptunterschied zwischen der Linie

Ship LilCutie; 

und

LilCutie("Boat", 1993); 

Zunächst ist eine Definition. Definition beschreibt und initialisiert eine Variable. Zweitens ist eine Anweisung auszuführen, bestehend aus Aufrufoperator (operator()).

Da Sie operator() für Typ Schiff nicht definiert haben, ist die zweite Zeile ungültig. Konstruktoren werden als Teil der Erstellung und Initialisierung eines Objekts aufgerufen. So sollen Sie schreiben entweder:

Ship LilCutie("Boat", 1993); 

oder

Ship LilCutie; 

LilCutie = Ship("Boat", 1993); 

Natürlich in zweitem Fall erste Zeile Standardkonstruktors ausführt, zweite Zeile ein neues Objekt des Schiffs erstellt und führt Zuordnung seines Wertes Standardoperator (wird im Falle eines String-Klassenfeldes funktionieren, das einen eigenen Operator definiert hat, würde ansonsten nur eine flache Kopie machen). Die Klammern() in beiden Zeilen sind Syntax für die Initialisierung.