C++中子类重定义错误

Error in redefinition of subclass 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_)
     ^

而且找不到问题所在

文件是:

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;
}

我知道主体不见了...但这肯定不是问题所在! 似乎编译器试图在 uni.cpp 文件中重新定义 类。 谢谢!

因为,您定义了 Studente 的构造函数两次。

在 header 中: Studente():Persona(){}; 这应该只是 Studente();

与其他构造函数相同。

问题是 header:

中的构造函数定义
Studente():Persona(){};

将其替换为声明,因为您在 .cpp 中有一个定义:

Studente();

uni.hclass Studente 你有

Studente():Persona(){};

这声明并定义了 Studente 的默认构造函数。然后在 uni.cpp 你有

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

其中重新定义了默认构造函数。您需要删除其中一个定义或更改

Studente():Persona(){};

Studente();