1

El ejercicio es el siguiente:

Dado la altura y la base de un rectángulo, calcule su área y perímetro.

Empecé a hacerlo de la forma que me explicaron en clase y este es mi código del main(tengo el rectangulo.h donde declaro la clase y rectangulo.cpp donde defino los métodos).

main.cpp

De esta manera sí me compila

#include "rectangulo.h"

#include <iostream>

using namespace std;

void IOParametros(Rectangulo& rect);
void IOArea(Rectangulo rect);
void IOPerimetro(Rectangulo rect);

int main()
{
    Rectangulo rectangulo;
    IOParametros(rectangulo);
    IOArea(rectangulo);
    IOPerimetro(rectangulo);
    cin.get();
}

void IOParametros(Rectangulo& rect)
{
    int x, y;
    cout << "Introduce la altura y la base del rectángulo" << endl;
    cin >> x >> y;

    rect.setX(x);
    rect.setY(y);
}

void IOArea(Rectangulo rect)
{
    int x, y, ar;
    x = rect.getX();
    y = rect.getY();

    ar = x * y;
    cout << "El área del rectángulo es " << ar << endl;
}

void IOPerimetro(Rectangulo rect)
{
    int x, y, per;

    x = rect.getX();
    y = rect.getY();

    per = (2*x)+(2*y);
    cout << "El perímetro del rectángulo es " << per << endl;
}

Pero si lo estructuro así para que quede algo más claro:

main.cpp

De esta manera no me compila

#include "rectangulo.h"

#include <iostream>

using namespace std;



int main()
{
    Rectangulo rectangulo;
    IOParametros(rectangulo);
    IOArea(rectangulo);
    IOPerimetro(rectangulo);
    cin.get();
}

io_rectangulo.cpp

#include "rectangulo.h"
#include <iostream>

using namespace std;

void IOParametros(Rectangulo& rect);
void IOArea(Rectangulo rect);
void IOPerimetro(Rectangulo rect);

void IOParametros(Rectangulo& rect)
{
    int x, y;
    cout << "Introduce la altura y la base del rectángulo" << endl;
    cin >> x >> y;

    rect.setX(x);
    rect.setY(y);
}

void IOArea(Rectangulo rect)
{
    int x, y, ar;
    x = rect.getX();
    y = rect.getY();

    ar = x * y;
    cout << "El área del rectángulo es " << ar << endl;
}

void IOPerimetro(Rectangulo rect)
{
    int x, y, per;

    x = rect.getX();
    y = rect.getY();

    per = (2*x)+(2*y);
    cout << "El perímetro del rectángulo es " << per << endl;
}

Me lanza estos errores: introducir la descripción de la imagen aquí

¿Cómo consigo que me compile al tener el main.cpp sin las funciones I/O, y un IO_rectangulo.cpp con las definiciones de las funciones de I/O?

PD: rectangulo.h para agregar más información:

#pragma once 

class Rectangulo
{
private:
    int _x, _y;
public:
    Rectangulo();
    int getX();
    void setX(int x);
    int getY();
    void setY(int y);
    int perimetro(int x, int y);
    int area(int x, int y); 
};
AguaSal
  • 412
  • 5
  • 19

1 Answers1

4

El problema es sencillo, y el propio compilador te lo está diciendo con claridad. Permíteme traducirlo por si tienes dificultades con el inglés:

Error: 'IOParametros' no ha sido declarado en este ámbito
Error: 'IOArea' no ha sido declarado en este ámbito
Error: 'IOPerimetro' no ha sido declarado en este ámbito

El la versión que no te compila, la Unidad de Traducción de main está usando tres funciones llamadas IOParametros, IOArea, e IOPerimetro de las cuales el compilador no tiene conocimiento. Por eso al añadirlas el programa compila.

¿Cómo consigo que me compile al tener el main.cpp sin las funciones I/O, y un IO_rectangulo.cpp con las definiciones de las funciones de I/O?

Esta es una pregunta trampa, y la respuesta es igual de tramposa: Jamás podrás compilarlo de la manera que describes.

Las instrucciones de inclusión de cabeceras (#include) son como copia-pegar el archivo incluido dentro del archivo en que está la instrucción de inclusión. Podrías crear un par archivos que contuvieran IOParametros, IOArea, e IOPerimetro:

IOFunciones.hpp
void IOParametros(Rectangulo& rect);
void IOArea(Rectangulo rect);
void IOPerimetro(Rectangulo rect);
IOFunciones.cpp
void IOParametros(Rectangulo& rect)
{
    // codigo...
}

void IOArea(Rectangulo rect)
{
    // codigo...
}

void IOPerimetro(Rectangulo rect)
{
    // codigo...
}

Después incluyes la cabecera correspondiente en main:

#include "rectangulo.h"
#include "IOFunciones.hpp"
#include <iostream>

int main()
{
    Rectangulo rectangulo;
    IOParametros(rectangulo);
    IOArea(rectangulo);
    IOPerimetro(rectangulo);
    cin.get();
    return 0; // <--- NO OLVIDES el return de main.
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Una pequeña consulta, el `return 0;` no es opcional? He leído a mucha gente en SO afirmar que no es necesario ponerlo. – Xam Feb 19 '18 at 16:25
  • 2
    Es una pregunta muy interesante y me alegro que la hagas porque así tengo la opción de sugerirte que abras una pregunta en el sitio para formularla :) – PaperBirdMaster Feb 19 '18 at 16:28