1

Me marca el error al querer reservar memoria para 'n' peliculas

//Main.cpp

introducir el código aquí

#include <iostream>
#include"Pelicula.h"
#include"Ficha.h"
#include"Cine.h"
#include<string.h>
#include<cstdlib>
using namespace std;

int main()
{

   Cine *C;
   int n,i;

   cout<< "Cuantas Peliculas? ";
   cin>>n;

   C = new Cine[n];

   for(i=0; i<n; i++){
    cout<< "Ingrese los datos de la pelicula "<<i+1<<endl;
    C[i].Leer();
    system("cls");
   }
   for(i=0; i<n; i++){
    cout<< "Las peliculas en el cine son: "<<endl;
   C[i].Imprimir();
   }
   delete []C;
    return 0;
}
//Ficha.h 
      #ifndef FICHA_H
#define FICHA_H
#include"Pelicula.h"
#include<string.h>
using namespace std;

class Ficha:public Pelicula
{
public:
    Ficha(string="",string="",int=1, int=60,string="");

    void Leer();
    void CalCosto();
    void Imprimir();

private:
    int Costo;
    string Tipo;

    };

#endif // FICHA_H
//Ficha.cpp
#include "Ficha.h"
#include"Pelicula.h"
#include<iostream>
#include<string.h>
using namespace std;

Ficha::Ficha(string nom,string gen,int dur, int cos,string     tip):Pelicula(nom,gen,dur),Costo(cos),Tipo(tip)
{
//ctor
}
void Ficha::Leer(){
Pelicula::Leer();
cout<< "Escriba el tipo de pelicula(1.- 2D,2.- 3D): ";
getline(cin,Tipo);

}
void Ficha::CalCosto(){
if(Tipo==1){
    cout<< "Costo: 35";
}else if(Tipo==2){
    cout<< "Costo: 60";
}
}
//Cine.h
#ifndef CINE_H
#define CINE_H
#include"Pelicula.h"
#include"Ficha.h"
#include<string.h>
using namespace std;

class Cine
{
public:
    Cine(Ficha,int=1,string="");
    void Leer();
    void Imprimir();

    void modificaTuFichaCine(Ficha);

private:
    Ficha fichacine;
    int NumeroDePeliculas();
    string ArregloDePeliculas();

};

#endif // CINE_H
//Cine.cpp
#include "Cine.h"
#include"Pelicula.h"
#include"Ficha.h"

Cine::Cine(Ficha fi,int numpel,string     arr):NumeroDePeliculas(numpel),ArregloDePeliculas(arr)
{
//ctor nacimiento.modificaTuD(f.dameTuD());

}
void Cine::Leer(){
cout<< "Ingrese cuantas peliculas :";
cin>>NumeroDePeliculas();
fichacine.Leer();

}
void Cine::Imprimir(){
fichacine.Imprimir();
}
//Pelicula.h
#ifndef PELICULA_H
#define PELICULA_H
#include<string.h>
#include<iostream>
using namespace std;

class Pelicula
{
public:
    Pelicula(string="",string="",int=1);

    void Leer();// void pidele
    void Imprimir();    //void muestra

private:
    string NombreDePelicula,Genero;
    int Duracion;
};

#endif // PELICULA_H
//Pelicula.cpp
#include "Pelicula.h"
#include<iostream>
#include<string.h>
using namespace std;

Pelicula::Pelicula(string nom,string gen,int     dur):NombreDePelicula(nom),Genero(gen),Duracion(Duracion)
{
//ctor
}
void Pelicula::Leer(){
cout<< "Ingrese el Nombre de la pelicula: ";
getline(cin,NombreDePelicula);
cout<< "Ingrese el genero: ";
getline(cin,Genero);
cout<< "Escriba la duracion: ";
cin>>Duracion;
}
void Pelicula::Imprimir(){
cout<< "Nombre de la Pelicula: "<<NombreDePelicula<<endl
    << "Genero: "<<Genero<<endl
    << "Duracion: "<<Duracion<<endl;
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
Julio Alvarado
  • 25
  • 1
  • 1
  • 6
  • Hola y bienvenido Julio. Podrías detallar mejor tu pregunta? Hay un pedazo de código sin nada de explicación de qué hace. SI puedes indicar dónde puede estar el error aún mejor. Un saludo. – Miquel Coll Jun 29 '16 at 07:10
  • Tal y como menciona @MiquelColl el código es demasiado grande para poder ser entendido fácilmente, lo mejor es aportar un código de ejemplo sencillo y compilable con tu problema (y muchas veces, generar dicho código te aporta a ti mismo la solución). – PaperBirdMaster Jun 29 '16 at 07:14

1 Answers1

4

Todo tu problema es reproducible con este sencillo código:

struct C
{
    C(int){};
};

int main()
{
    int n{};

    std::cout<< "Cuantos n? ";
    std::cin >> n;

    C *c = new C[n]; // error al querer reservar memoria para 'n' C
    return 0;
}

El error es bastante claro y lo tienes en el propio título, mas no se por qué con nombre cambiado:

Te falta constructor por defecto para Cine. Al pedir memoria para Cine:

C = new Cine[n];

Estás construyendo n instancias, cada una de las instancias, de acuerdo con su constructor requieren una Ficha un int y un string:

Cine(Ficha,int=1,string="");

El entero y la cadena disponen de un parámetro por defecto pero el parámetro Ficha es requerido... ¿Dónde se lo estás pasando a cada una de las n instancias creadas? En ningún sitio, ese es el error.

Soluciónes

Tienes 3 soluciones a tu problema.

Crea un constructor sin parametros.

class Cine
{
public:
    Cine(Ficha,int=1,string="");
    Cine() // <---- constructor sin parametros
    {
            ...
            ...
            ...
    }
    void Leer();
    void Imprimir();

    void modificaTuFichaCine(Ficha);

private:
    Ficha fichacine;
    int NumeroDePeliculas();
    string ArregloDePeliculas();
};

Si dispones de compilador C++11 o superior, puedes decirle al compilador que se encargue de generar el código por defecto para el constructor sin parámetros:

class Cine
{
public:
    Cine(Ficha,int=1,string="");
    Cine() = default; // <---- constructor por defecto
    void Leer();
    void Imprimir();

    void modificaTuFichaCine(Ficha);

private:
    Ficha fichacine;
    int NumeroDePeliculas();
    string ArregloDePeliculas();
};

Define un valor por defecto para el primer parametro de Cine

class Cine
{
public:
    Cine(Ficha={},int=1,string="");
    void Leer();
    void Imprimir();

    void modificaTuFichaCine(Ficha);

private:
    Ficha fichacine;
    int NumeroDePeliculas();
    string ArregloDePeliculas();
};

Usa std::vector<Cine>.

std::vector dispone de un constructor en que le puedes indicar cuántos elementos quieres construir de golpe y toma como modelo un elemento ya construido, así que podrías hacer:

int main()
{
    int n{};

    std::cout << "Cuantas Peliculas? ";
    std::cin >> n;

    std::vector<Cine> C(n, Cine{Ficha{}});

    for (int i = 0; i < n; ++i){
        std::cout << "Ingrese los datos de la pelicula " << i + 1 << std::endl;
        C[i].Leer();
        system("cls");
    }
    for(int i = 0; i < n; ++i){
        std::cout << "Las peliculas en el cine son: " << std::endl;
        C[i].Imprimir();
    }

    // No necesitas delete C, "se borra solo".
    return 0;
}

Notas adicionales.

  • Si vas a rellenar los datos de Cine después de construirlo (en lugar de en el momento de la construcción) ¿para qué le das un constructor con parámetros?, elimina dicho constructor.
  • El using namespace std no es pecado, pero te aconsejo que eches un vistazo a este hilo para saber por qué se suele desaconsejar.
  • Abusas de std::endl, lo cuál normalmente no es buena idea, te aconsejo echar un vistazo a este hilo para conocer más detalles.
  • En los bucles for usa pre-incremento siempre que te sea posible.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82