在C++中重新定义子类时出错

Error in redefinition of subclass in C++

本文关键字:定义 子类 出错 C++ 新定义      更新时间:2023-10-16

我从编译器中得到以下错误:

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的构造函数。

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

与其他构造函数相同。

问题在于标头中的构造函数定义:

Studente():Persona(){};

用声明替换它,因为.cpp:中有一个定义

Studente();

class Studenteuni.h中,您有

Studente():Persona(){};

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

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

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

Studente():Persona(){};

Studente();