2016-04-05 5 views
0

i von Compiler erhalten folgende Fehlermeldung:Fehler bei Neudefinition der Unterklasse in C++

uni.cpp:63:1: error: redefinition of ‘Studente::Studente()’ 
Studente::Studente() : Persona(){ 
^ 

In file included from uni.cpp:1:0: 
uni.h:34:5: note: ‘Studente::Studente()’ previously defined here 
    Studente():Persona(){}; 
    ^

uni.cpp:68:1: error: redefinition of ‘Studente::Studente(std::__cxx11::string, std::__cxx11::string, int, int, int, std::__cxx11::string, std::__cxx11::string)’ 
Studente::Studente(string nome_,string cognome_,int anno_,int mese_,int giorno_,string facolta_,string corso_) : Persona(nome_,cognome_,anno_,mese_,gi 
^ 

In file included from uni.cpp:1:0: 
uni.h:35:5: note: ‘Studente::Studente(std::__cxx11::string, std::__cxx11::string, int, int, int, std::__cxx11::string, std::__cxx11::string)’ previously defined here 
    Studente(string nome_,string cognome_,int anno_,int mese_,int giorno_,string facolta_,string corso_) : Persona(nome_,cognome_,anno_,mese_,giorno_) 
    ^

und können nicht herausfinden, was falsch ist

Die Datei ist:

UNI.H

#ifndef _UNI_H_ 
#define _UNI_H_ 
#include <string> 
#include <iostream> 
using namespace std; 

class Persona{ 
    private: 
    string nome; 
    string cognome; 
    int anno; 
    int mese; 
    int giorno; 
    public: 
    Persona(); 
    Persona(string nome_,string cognome_,int anno_,int mese_,int giorno_); 
    void SetNome(string nome_); 
    void SetCognome(string cognome_); 
    void SetAnno(int anno_); 
    void SetMese(int mese_); 
    void SetGiorno(int giorno_); 
    string GetNome(); 
    string GetCognome(); 
    int GetAnno(); 
    int GetMese(); 
    int GetGiorno(); 
}; 

class Studente : public Persona{ 
    private: 
    string facolta; 
    string corso; 
    public: 
    Studente():Persona(){}; 
    Studente(string nome_,string cognome_,int anno_,int mese_,int giorno_,string facolta_,string corso_) : Persona(nome_,cognome_,anno_,mese_,giorno_){}; 
    void SetFacolta(string facolta_); 
    void SetCorso(string corso_); 
    string GetFacolta(); 
    string GetCorso(); 
}; 

#endif 

UNI.CPP

#include "uni.h" 
#include <iostream> 
#include <string> 
using namespace std; 

Persona::Persona(){ 
    SetNome(""); 
    SetCognome(""); 
    SetAnno(0); 
    SetMese(0); 
    SetGiorno(0); 
} 

Persona::Persona(string nome_,string cognome_,int anno_,int mese_,int giorno_){ 
    SetNome(nome_); 
    SetCognome(cognome_); 
    SetAnno(anno_); 
    SetMese(mese_); 
    SetGiorno(giorno_); 
} 

void Persona::SetNome(string nome_){ 
    nome=nome_; 
} 

void Persona::SetCognome(string cognome_){ 
    cognome=cognome_; 
} 

void Persona::SetAnno(int anno_){ 
    anno=anno_; 
} 

void Persona::SetMese(int mese_){ 
    mese=mese_; 
} 

void Persona::SetGiorno(int giorno_){ 
    giorno=giorno_; 
} 

string Persona::GetNome(){ 
    return nome; 
} 

string Persona::GetCognome(){ 
    return cognome; 
} 

int Persona::GetAnno(){ 
    return anno; 
} 

int Persona::GetMese(){ 
    return mese; 
} 

int Persona::GetGiorno(){ 
    return giorno; 
} 


Studente::Studente() : Persona(){ 
    SetFacolta(""); 
    SetCorso(""); 
} 

Studente::Studente(string nome_,string cognome_,int anno_,int mese_,int giorno_,string facolta_,string corso_) : Persona(nome_,cognome_,anno_,mese_,giorno_){ 
    SetFacolta(facolta_); 
    SetCorso(corso_); 
} 

void Studente::SetFacolta(string facolta_){ 
    facolta=facolta_; 
} 

void Studente::SetCorso(string corso_){ 
    corso=corso_; 
} 

string Studente::GetFacolta(){ 
    return facolta; 
} 

string Studente::GetCorso(){ 
    return corso; 
} 

Ich weiß, das Haupt fehlt ... aber das ist sicher nicht das Problem! Scheint, dass der Compiler versucht, die Klassen in der uni.cpp-Datei neu zu definieren. Danke!

+1

Dies ist ändern nicht das Problem, sondern die Namen, die mit einem Unterstrich beginnen mit einem Großbuchstaben ('_UNI_H_') und Namen gefolgt die zwei aufeinanderfolgende Unterstriche enthalten, sind für die Implementierung reserviert. Benutze sie nicht. –

Antwort

3

Weil Sie den Konstruktor Studente zweimal definieren.

In der Kopfzeile: Studente():Persona(){}; Dies sollte nur Studente();

Gleiche mit dem anderen Konstruktor sein.

+0

Danke euch allen, ich lerne immer noch und das war eine dumme Frage! – Ghesio

2

Das Problem ist, diese Konstruktor Definition in der Kopfzeile:

Studente():Persona(){}; 

es mit einer Erklärung ersetzen, da Sie eine Definition in der CPP haben:

Studente(); 
2

In uni.h im class Studente Sie haben

Studente():Persona(){}; 

Dies erklärt und definiert ein Standardkonstruktor für Studente. Dann in uni.cpp haben Sie

Studente::Studente() : Persona(){ 
    SetFacolta(""); 
    SetCorso(""); 
} 

, die das Standard-Konstruktor neu definiert. Sie müssen eine der Definitionen entfernen oder

Studente():Persona(){}; 

zu

Studente(); 
Verwandte Themen