1

Quisiera hacer un arreglo en C++ de tipo Punto, pero no sé cómo hacerlo.

Este es mi código:

#include <windows.h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <stdlib.h>
#include "Punto.h"
#include "Linea.h"

Punto *vertices[2] = new Punto[2];

void init()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-200, 200, -200, 200);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    vertices[0] = new Punto(10.0, 25.0);

    Linea *l = new Linea(p1, p2);
    l->dibuja();


    delete l;

    glFlush();
}

int main(int argc, char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//SE INIZIALIZA LAS VARIABLES DE ENTORNO EN UN SOLO BUFFER Y COLOREA RGB
    glutInitWindowSize(400, 400);// se define el tamaño de la ventana
    glutInitWindowPosition(50,50); // se define las coordenadas inicilaes donde aparacera la ventana
    glutCreateWindow("Parcial_1");//crea una ventana y se le coloca una leyenda hola mundo
    init();                          //Funcion de servicio para inizializar parametros del ambiente grafico
    glutDisplayFunc(display);          // se define cula es la funcion que redibujara el ambiente grafico
    //glutIdleFunc(display);

    glutMainLoop();

    return 0;
}

Código de Punto.h

#ifndef PUNTO_H
#define PUNTO_H

class Punto
{
    public:
        double x, y;

    public:
        Punto(double x, double y);
        void dibuja(void);
        virtual ~Punto();

    protected:

    private:
};

#endif // PUNTO_H

Código de Punto.cpp

#include <windows.h>
#include <GL/glut.h>
#include "Punto.h"

Punto::Punto(double x, double y)
{
    this->x = x;
    this->y = y;
}

void Punto::dibuja(void)
{
    glBegin(GL_POINTS);
        glVertex2d(x, y);
    glEnd();
}

Punto::~Punto()
{
    //dtor
}

El error es aquí

Punto *vertices[2] = new Punto[2];

El error que marca es "no maching function for call 'Punto::Punto()'" Y quisiera saber si la incialización de se puede hacer como se hace en Java o C#

EmmanCanVaz_95
  • 175
  • 2
  • 15

2 Answers2

1

El problema lo tienes aquí:

Punto *vertices[2] = new Punto[2];

Para que eso funcione, tu clase Punto necesita de un constructor sin parámetros; sin embargo, tu clase no lo tiene.

Puede que sepas que C++ genera los constructores por ti ... si tú no generas ninguno. Como tienes un constructor Punto::Punto(double x, double y), el compilador no genera ninguno, y te muestra el error indicado.

La solución mas fácil es crear tu propio constructor sin argumentos:

Punto.h

#ifndef PUNTO_H
#define PUNTO_H

class Punto
{
    public:
        double x, y;

    public:
        Punto( ); //<- AÑADIMOS ESTO
        Punto(double x, double y);
        void dibuja(void);
        virtual ~Punto();

    protected:

    private:
};

Punto.cpp

#include <windows.h>
#include <GL/glut.h>
#include "Punto.h"

// AÑADIMOS ESTO. CONSTRUCTOR SIN PARÁMETROS
Punto::Punto( ) : x( 0.0 ), y( 0.0 ) {
}

Punto::Punto(double x, double y)
{
    this->x = x;
    this->y = y;
}

void Punto::dibuja(void)
{
    glBegin(GL_POINTS);
        glVertex2d(x, y);
    glEnd();
}

Punto::~Punto()
{
    //dtor
}

Con eso, asignamos los valores 0, 0 a tu Punto, cuando lo creamos sin ningún parámetro en el constructor.

Trauma
  • 25,297
  • 4
  • 37
  • 60
0

El problema es que el compilador espera el operador () y no []. Bueno, eso es de entrada, pero la real solución la hice viendo un artículo que dejaré el link aquí: https://www.foro.lospillaos.es/c-array-de-objetos-vt14173.html

Bueno, en primer lugar, quite el operador new seguido de la clase Punto y lo deje tal cual, un arreglo de punteros.

Código

#include <windows.h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <stdlib.h>
#include "Punto.h"
#include "Linea.h"

Punto *vertices[2];

void init()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-200, 200, -200, 200);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    vertices[0] = new Punto(10.0, 5.0);
    vertices[1] = new Punto(150, 150);

    Linea *l = new Linea(vertices);
    l->dibuja();


    delete l;

    glFlush();
}

int main(int argc, char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//SE INIZIALIZA LAS VARIABLES DE ENTORNO EN UN SOLO BUFFER Y COLOREA RGB
    glutInitWindowSize(400, 400);// se define el tamaño de la ventana
    glutInitWindowPosition(50,50); // se define las coordenadas inicilaes donde aparacera la ventana
    glutCreateWindow("Parcial_1");//crea una ventana y se le coloca una leyenda hola mundo
    init();                          //Funcion de servicio para inizializar parametros del ambiente grafico
    glutDisplayFunc(display);          // se define cula es la funcion que redibujara el ambiente grafico
    //glutIdleFunc(display);

    glutMainLoop();

    return 0;
}

Pongo el código de main.cppya que es e único fichero que modifiqué.

EmmanCanVaz_95
  • 175
  • 2
  • 15