0

Estoy aprendiendo programación POO y tengo un pequeño error al intentar hacer mi primer "objeto". Me da este error.

C:\Users\Manflack\AppData\Local\Temp\ccf4P5ij.o poo3.cpp:(.text+0x181): undefined reference to `Persona::Persona(int, int, int)'

Este es mi código:

#include<iostream>
using namespace std;
class Persona{
private:
int alt,pe,prommd; //alto peso promediomes
public:
Persona(int,int,int);
void asignAlt(int,int);
void cPe(int,int,int);
void promm(int);
void prnt();
};

void Persona::asignAlt(int mAlt,int pAlt){
alt=(mAlt+pAlt)/2; }
void Persona::cPe(int mPe,int pPe,int cd){
pe=((mPe+pPe)/2)+cd/100; }
void Persona::promm(int prom){
prommd=prom/30; }
void Persona::prnt(){
cout<<"La altura de la persona es de: "<<alt<<"\nSu peso es de: "<<pe<<"\nY su ingreso diario es de: "<<prommd; }

main(){
int t1,t2,t3;
cout<<"Ingrese la altura de su madre y su padre: ";
cin>>t1>>t2;
Persona Mariano(t1,t2,t3);
cout<<"Ingrese el peso de su madre, su padre y cuantas calorias consume al dia: ";
cin>>t1>>t2>>t3;
Mariano.cPe(t1,t2,t3);
cout<<"Ingrese su sueldo promedio al mes: "<<endl;
cin>>t1;
Mariano.promm(t1);
Mariano.prnt();

cin.get();
return 0; }
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
Manflack
  • 48
  • 1
  • 9
  • Puede que [esta guía](https://es.stackoverflow.com/questions/65557/simbolo-externo-sin-resolver-qu%c3%a9-he-hecho-mal) te ayude a entender el problema. – PaperBirdMaster Apr 26 '17 at 10:26

3 Answers3

2

Te está indicando claramente el error:

undefined reference to Persona::Persona(int, int, int)

Esa línea viene a decir: "No encuentro la definición de la función Persona con tres parámetros int en el contexto de Persona::.

Problema

Esto puede suceder por dos motivos:

  1. La función Persona::Persona(int, int, int) está declarada pero no está definida. En otras palabras, la función existe pero no tiene cuerpo (el cuerpo de la función es lo que va entre llaves { y }.
  2. La función Persona::Persona(int, int, int) está declarada y definida pero el compilador no encuentra la definición. Tal vez la definición esté en otro archivo de código que por algún motivo no está siendo compilado.

Solución

Añade la definición de la función Persona::Persona(int, int, int) (constructor) a tu código; para hacerlo "más claro" yo la añadiría en la misma posición que la declaración, es decir antes de la función Persona::asignAlt:

Persona::Persona(int altura, int peso, int promedio) :
    alt(altura), pe(peso), prommd(promedio) {}

void Persona::asignAlt(int mAlt,int pAlt){
alt=(mAlt+pAlt)/2; }
void Persona::cPe(int mPe,int pPe,int cd){
pe=((mPe+pPe)/2)+cd/100; }
void Persona::promm(int prom){
prommd=prom/30; }
void Persona::prnt(){
cout<<"La altura de la persona es de: "<<alt<<"\nSu peso es de: "<<pe<<"\nY su ingreso diario es de: "<<prommd; }
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
0
Persona::Persona(int, int , int)
{

}

Agrégale esta linea el problema es que no has agregado la declaración del constructor.

Black Sheep
  • 13,096
  • 6
  • 36
  • 60
Diego
  • 1
0

El problema es con el constructor de tu clase Persona, ya que los constructores y destructores no llevan un ; al final.

Persona{
    public:
        Persona(){}  // Contructor
        ~Persona(){} // Destructor
};
akko
  • 2,378
  • 2
  • 27
  • 56
  • Estás mezclando churras con merinas. En la declaración de la clase (_la parte que tu comentas_) puede haber implementación de funciones o no. Si implementas en la declaración (_algo generalmente no recomendado_), entonces tu solución sí es aplicable. Sin embargo, si la implementación va por separado es imperativo finalizar las funciones con punto y coma para que la posterior implementación sea tomada como válida. – eferion Dec 12 '16 at 08:21
  • Como mencioné: Los constructores y destructores. – akko Dec 12 '16 at 16:24
  • El ejemplo que pones únicamente es válido si la implementación se encuentra en la cabecera... si quieres mover la implementación a un `cpp` tienes que dejar la función (sea constructor, destructor o cualquier otra) acabando en punto y coma. – eferion Dec 12 '16 at 16:26