2016-05-03 13 views
-1

Hier ist der Fehler, den ich bekomme.Compiler Fehler in C++

CruiseShip.h:10: error: expected ‘;’ before ‘::’ token

CruiseShip.cpp:8: error: expected ‘)’ before ‘name’ make: ***

[CruiseShip.o] Error 1

CruiseShip.h

CruiseShip(std::string name,std::string year, int maxPassengers)::Ship(std::string name,std::string year); 

CruiseShip.cpp

CruiseShip(string name, string year, int maxPassengers)::Ship(string name, string year){ 
    maxPassengers=0; 
} 

Dies sind die Linie ist, wo der Fehler auftritt. Hier

ist der Rest des Codes: CruiseShip.cpp

#include <iostream> 
#include "Ship.h" 
#include "CruiseShip.h" 
using namespace std; 



CruiseShip(string name, string year, int maxPassengers)::Ship(string name, string year){ 
    maxPassengers=0; 
} 

void CruiseShip::setPass(int maxPassengers){ 
    this->maxPassengers=maxPassengers; 
} 
int CruiseShip::getPass(){ 
    return maxPassengers; 
} 

void CruiseShip::print(){ 
    cout<<"The name of the ship is "<<getName()<<endl; 
    cout<<"The capacity of the ship is "<<maxPassengers<<endl; 

} 

CruiseShip.h

#ifndef CRUISESHIP_H_ 
#define CRUISESHIP_H_ 
#include <string> 
class CruiseShip: public Ship{ 
protected: 
    int maxPassengers; 


public: 
    CruiseShip(std::string name,std::string year, int maxPassengers)::Ship(std::string name,std::string year); 
    void setPass(int); 
    int getPass(); 
    virtual void print(); 

}; 
#endif 
+0

Soll das eine Vorlage sein? So verwenden Sie keine Vorlage. –

+1

Ich sehe nicht ganz, was diese Zeilen tun sollen. Bitte poste ein [mcve]. –

+0

Geben Sie Ihren Code ein. –

Antwort

2

Diese Linie scheint keinen Sinn zu machen.
Was denkst du soll es tun?

CruiseShip(std::string name,std::string year, int maxPassengers)::Ship(std::string name,std::string year); 

Es sieht aus wie der Anfang eines Konstruktor für class CruiseShip, aber hat dann eine Scoping (::) vor für class Ship wie der Konstruktor zu suchen beginnen. Hier

ist, was ich denke du meinst:

In Header (.h) Datei:

#pragma once 
#include <string> 
using std::string; 
class CruiseShip : 
    public Ship // Class inherits from base-class Ship 
{ 
    // Constructor takes 3 parameters: 
    CruiseShip(const string& name, const string& year, int maxPassengers); 
}; 

In-Implementierung (CPP) File:

// Implementation of the Constructor, which begins by passing 
// name and year to the Base-Class constructor. 
// Then completes the constructor by handling the maxPassengers parameter. 
CruiseShip::CruiseShip(const string& name, const string& year, int maxPassengers): 
    Ship(name, year) // Call the base-class constructor 
{ 
    this->maxPassengers = maxPassengers; // Also assign member variable. 
} 


Ein paar andere Anmerkungen:

  • Sie sollten Variablen in der Regel durch const-Referenz übergeben, wenn Sie keinen guten Grund haben, nach Wert zu übergeben. Dies vermeidet überflüssige Kopierkonstruktoren.

  • Vermeiden Sie den gesamten #ifdef - #endif Schutz mit #pragma once, die jetzt von den meisten großen Compiler unterstützt wird.

  • Tun Sie nicht using namespace std;. Es bringt den gesamten Namensraum, der wirklich groß ist. Importieren Sie einfach, was Sie brauchen: using std::string; (siehe This Topic)

3

Offenbar CruiseShip erbt von Ship.

sollte die Erklärung nur sagen, was der Prototyp Konstruktor ist

CruiseShip(std::string name, std::string year, int maxPassengers); 

und die Definition funktioniert die Initialisierung:

CruiseShip::CruiseShip(string name, string year, int maxPassengers) 
    : Ship(name, year), 
    maxPassengers(maxPassengers) 
{ 

} 

Beachten Sie, dass nur es gibt einen einzigen Doppelpunkt und dass die Initialisierung der Basisklasse doesn Erwähnen Sie die Typen nicht wie einen Funktionsaufruf.
Auch die Konstruktordefinition benötigt die Bereichsspezifikation CruiseShip::.

+0

Hat dies eingegeben. Du bist zu schnell – Hearner

+0

Du hast widersprüchliche Variablen für 'maxPassengers' und du wirfst den Parameter' maxPassengers' weg, ohne ihn jemals zu benutzen. – abelenky

+0

Dumme Frage, die Erklärung ist in der Header-Datei richtig? Wenn ich das ändere, findet der Compiler keine passende Funktion, da sie sich unterscheiden. @molbdnilo – willh231

0

Ihre Schiffsklasse hat, so etwas haben:

Ship(std::string,std::string); 

in öffentlichen Erklärungen. Denn das ist, was Sie fordern, wenn Sie Parameter geben in CruiseShip

Die Art und Weise eine korrekte Konstruktor mit inherence machen, ist auf diese Weise:

CruiseShip::CruiseShip(string name, string year, int maxPassengers):Ship(name,year){ 
    maxPassengers=0; 
} 

Sie rufen den Konstruktor mit Parametern Ship(std::string,std::string), die Parameter gegeben nimmt durch CruiseShip. Und Sie sagen einfach dem Programm, welche Variablen Sie geben

Ihre CruiseShip-Klasse, weil es falsch ist. Sie sagen dem Programm nicht, zuerst anzurufen.

#ifndef CRUISESHIP_H_ 
#define CRUISESHIP_H_ 
#include <string> 
class CruiseShip: public Ship{ 
protected: 
    int maxPassengers; 


public: 
    CruiseShip(std::string name,std::string year, int maxPassengers); 
    void setPass(int); 
    int getPass(); 
    virtual void print(); 

}; 
#endif