2016-04-19 2 views
0

меня возникли проблемы написания кода, в котором класс, который наследует от другого класса повторно использует функцию этого класса в одном из своих функций
файла pessoa.h:Повторного использования функций в C++

#ifndef PESSOA_H 
#define PESSOA_H 
#include "data.h" 
#include <string> 

class Pessoa 
{ 
    string nome; 
    Data aniversario; 
public: 
    Pessoa(string tnome, Data taniversario){nome = tnome; aniversario =  taniversario;} 
Pessoa(){}; 
int Aniversario(Data data_atual); 
virtual void imprime(); 
~Pessoa(); 

}; 

#endif 

файла Universitário .h:

#ifndef UNI_H 
#define UNI_H 
#include "pessoa.h" 
#include "data.h" 

class Universitario: public Pessoa 
{ 
    int matricula; 
    Data ingresso; 

public: 
    Universitario(int tmatricula, Data tingresso, string nome, Data  aniversario): 
    Pessoa(nome, aniversario) {matricula = tmatricula; ingresso = tingresso;} 
    Universitario(){}; 
    void imprime(); 
    ~Universitario(); 


}; 

#endif 

функция imprime() определение из pessoa.cpp:

void Pessoa::imprime() 
{  
    cout << "Nome: " << this->nome << endl; 

} 

функция imprime() определение из uni.cpp:

void Universitario::imprime() 
{ 
    this->imprime(); 
    cout << "Matricula: " << this->matricula << endl; 
    ingresso.imprimed(); 

} 

Ошибка я получаю это:

Undefined symbols for architecture x86_64: 
    "Pessoa::~Pessoa()", referenced from: 
     Universitario::~Universitario() in main-0c1624.o 
     Universitario::Universitario(int, Data,  std::__1::basic_string<char, std::__1::char_traits<char>,  std::__1::allocator<char> >, Data) in main-0c1624.o 
    "typeinfo for Pessoa", referenced from: 
     typeinfo for Universitario in main-0c1624.o 
    "vtable for Pessoa", referenced from: 
     Pessoa::Pessoa(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, Data) in main- 0c1624.o 
    NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Я предполагаю, что ошибка либо на виртуальной или это.

+0

'void Universitario :: imprime() { это-> imprime();' бесконечный цикл. Измените 'this-> imprime' на' Pessoa :: imprime', если все, что вы хотите, сначала вызовите метод базового класса. – bipll

ответ

2
"Pessoa::~Pessoa()", referenced from: 

Вам необходимо реализовать свой деструктор. Вы только объявили это.

Вместо этого:

~Pessoa(); 

Попробуйте это:

~Pessoa() {} 

То же самое справедливо и для деструктора Университарио.

+0

я сделал это и получил это: Неопределенные символы для архитектуры x86_64: «TypeInfo для Пессоа», ссылками из: TypeInfo для Университарио~d в главной 0275b3.o «для Пессоа виртуальных таблиц», ссылками из: Пессоа :: ~ Пессоа() в main-0275b3.o Pessoa :: Pessoa (std :: __ 1 :: basic_string , std :: __ 1 :: распределитель >, данные) в main-0275b3. o ПРИМЕЧАНИЕ. Отсутствующая виртуальная таблица обычно означает, что первая неединичная виртуальная функция-член не имеет определения. ld: символы (символы) не найдены для архитектуры x86_64 clang: ошибка: команда компоновщика не удалась с кодом выхода 1 (используйте -v, чтобы увидеть invocatio – emic

+0

@emic: вы уверены, что вы перекомпилировали все ваши .cpp-файлы и указали. os при связывании? Вы должны отредактировать свои шаги компиляции в конце вопроса. –

+0

Деструктор, вероятно, должен быть виртуальным и может быть по умолчанию. – MikeMB

Смежные вопросы