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

时间:2016-04-05 14:05:51

标签: c++ class subclass

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

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文件中的类。 谢谢!

3 个答案:

答案 0 :(得分:3)

因为,你要两次定义Studente的构造函数。

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

与其他构造函数相同。

答案 1 :(得分:2)

问题是标题中的构造函数定义:

Studente():Persona(){};

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

Studente();

答案 2 :(得分:2)

uni.h中的class Studente

Studente():Persona(){};

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

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

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

Studente():Persona(){};

Studente();