Ver la versión completa : problema código c++
serlioner
26/01/2013, 17:50
hola, estoy intentando hacer un programa para una práctica de la carrera, pero no consigo que me compile, el fallo esta en el creador de la clase Cuadrado2D pero no se por que, si alguien me puede ayudar se lo agradecería mucho, pongo los código:
#ifndef _POLIGONO2D_HPP_
#define _POLIGONO2D_HPP_
#include <vector>
#include "punto2D.hpp"
using namespace std;
namespace poo
{
class Poligono2D
{
private:
vector<Punto2D> *_vertices;
public:
inline Poligono2D (int nvertices)
{
_vertices->resize(nvertices);
}
inline int getNumeroVertices()
{
return _vertices->size();
}
inline vector<Punto2D> *getVertice(int indice)
{
vector<Punto2D> * a;
a=&_vertices[indice];
return a;
}
inline void setVertice(int indice, vector<Punto2D> p)
{
_vertices[indice]=p;
}
virtual int calcularPerimetro();
virtual int calcularArea();
};
}
#endif
en donde está el fallo:
#ifndef _CUADRADO2D_HPP_
#define _CUADRADO2D_HPP_
#include "punto2D.hpp"
#include<cmath>
using namespace std;
namespace poo
{
class Cuadrado2D:public Poligono2D
{
private:
string nombre;
int color;
public:
inline Cuadrado2D()
{
poo::Poligono2D::Poligono2D(3);
}
};
}
#endif
y el principal:
#include<iostream>
#include"poligono2D.hpp"
#include"punto2D.hpp"
#include"cuadrado2D.hpp"
using namespace poo;
main()
{
}
pero todo esta en el mismo fichero o que?
en donde está el fallo:
#ifndef _CUADRADO2D_HPP_
#define _CUADRADO2D_HPP_
#include "punto2D.hpp"
#include<cmath>
#include "poligono2d.hpp"
using namespace std;
namespace poo
{
class Cuadrado2D:public Poligono2D
{
private:
string nombre;
int color;
public:
inline Cuadrado2D() : Poligono2D (3)
{
//poo::Poligono2D::Poligono2D(3);
}
};
}
#endif
No se, veo varias cosas "raras", yo no las harias asi.
1.- Cuadrado2D hereda de Poligono 2D, pero cojones, si estan en ficheros distintos, tendras que hacer los includes de las definiciones, no?
2.- Son muy interesantes los constructores por defecto y los constructores copia, yo los pondria
3.- Estas intentando anidar un objeto poligono2D en el constructor de cuadrado, cuando Cuadrado2d hereda de poligono2d todos sus atributos y procedimientos. No es necesario
-----Actualizado-----
por cierto, la salida del compilador para saber cual es el error es VITAL
serlioner
26/01/2013, 18:18
vale, muchas gracias, ahora si va al cambiar
inline Cuadrado2D() : Poligono2D (3)
{
//poo::Poligono2D::Poligono2D(3);
}
};
intentaré ver estas cosas la próxima vez antes de preguntar.
el fallo era el 3 de la lista de mi anterior post entonces,
porque:
1.- Si cuadrado2d hereda de poligono2d, normalmente no es necesario que tenga un objeto de tipo poligono2d, porque cuadrado2d es en realidad un poligono2d y su "mochila" de cuadrado
2.- Si creas un objeto "hijo" (cuadrado2d) automaticamente se crea un objeto "padre" (poligono2d), porque aunque no0 se exprese automaticamente EL CONSTRUCTOR DEL HIJO LLAMA AL CONSTRUCTOR DEL PADRE
3.- Si no se especifica un constructor de padre de manera implicita, el hijo llama al constructor por defecto del padre
4.- Si un objeto no tiene constructores, el compilador le crea uno "por defecto"
5.- Si un objeto tiene al menos un constructor, puede perder el constructor por defecto que le da el compliador
6.- El constructor no se puede llamar del mismo modo que una funcion
En tu programa tenias
inline Cuadrado2D() <- Como no especificas un constructor padre, llama al constructor por defecto, que NO EXISTE EN EL PADRE
{
poo::Poligono2D::Poligono2D(3); <- LLAMAR AL CONSTRUCTOR DEL PADRE COMO SI FUESE UNA FUNCION. NO. MAL. FATAL.
}
inline Cuadrado2D() : Poligono2D (3) <-LLAMAMOS AL CONSTRUCTOR CON PARAMETROS DEL PADRE DESDE EL CONSTRUCTOR DEL HIJO
{
//poo::Poligono2D::Poligono2D(3); <- // para comentar
}
};
serlioner
26/01/2013, 19:24
vale apuntado queda, gracias de nuevo por la explicación (mis clases de programación de este año han sido un poco anarquicas y nos hemos tenido que buscar la vida por eso tengo algún que otro fallo de base importante).
-----Actualizado-----
.. bueno ya por último (y perdón por las preguntas chorras) pero como puedo acceder a las variables que contiene el vector (vector<Punto2D> *_vertices;) ya que son de una clase y no se como puedo acceder a ellas.
si metes los vertices en un vector de las stl te puedes ahorrar el *.
Para acceder a los elementos del vector puedes usar un iterador o acceder como si fuera un array usando el operador [].
-----Actualizado-----
Esto esta mal
inline vector<Punto2D> *getVertice(int indice)
{
vector<Punto2D> * a;
a=&_vertices[indice];
return a;
}
inline void setVertice(int indice, vector<Punto2D> p)
{
_vertices[indice]=p;
}
Deberia ser asi:
inline Punto2D getVertice(int indice) const
{
return _vertices[indice];
}
inline void setVertice(int indice, const Punto2D &p)
{
_vertices[indice]=p;
}
Vertices[indice].variablePublic
Vértices[indice]->variablePublic
Algo=Vertices[indice].dameAlgo()
Ago=verticels['indce]->damealgo()
Depende de si accedes al objeto directamente o mediante puntero
serlioner
27/01/2013, 13:20
vale práctica terminada, muchas gracias a los 2, me estudiare bien las correcciones (y intentare ser menos chapuza programando).
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.