• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Problem z Klasą c++

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+1 głos
721 wizyt
pytanie zadane 1 kwietnia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)
zamknięte 1 kwietnia 2017 przez heros22pt

Witam, mam problem z kasą abstrakcji. wyskakuje mi błąd "Cannot instantiate abstract class" i nie mam pojęcia co tak na prawdę robię nie tak.

Problem wyskakuje przy tworzeniu nowego elementu cRectangle/

void cScena::klawisz(unsigned char znak, int x, int y)
{
	std::cout << "Naciśnięto klawisz: " << znak << ", a myszka znajduje się w pozycji: " << x << ", " << y << "(w pikselach)" << std::endl;
	switch (znak)
	{

	case 'p':
	{
		cRectangle *pr = new cRectangle; //w tym miejscu jest blad
		tab.push_back(pr);
		aktywny = tab.size() - 1;
		break;
	}
...
}

plik nagłówkowy tej klasy to:

#ifndef SCENA_H_
#define SCENA_H_

#include <vector>
#include "figura.h"
#include "prostokat.h"


using namespace std;

class cScena
{
public:

	cScena();

	void rysuj();
	void klawisz(unsigned char znak, int x, int y);
	void inicjuj();
private:

	int aktywny;
	vector<cFigura*> tab;
};
extern cScena scena;


#endif

oprócz tego mam zdefiniowaną w osobnym pliku klasę cRectangle, która jest na na pewno poprawna. Jeśli ma ktoś jakiś pomysł, byłbym wdzięczny za pomoc.

komentarz zamknięcia: Problem rozwiązany
komentarz 1 kwietnia 2017 przez Ehlert Ekspert (215,010 p.)

Pokaż klasę cRectangle.

komentarz 1 kwietnia 2017 przez mokrowski Mędrzec (158,660 p.)
Pokaż deklarację cRectangle.

PS. O kolega mnie wyprzedził :-)
komentarz 1 kwietnia 2017 przez heros22pt Użytkownik (950 p.)

klasa:

class cRectangle :public cFigura
{
protected:
	float a, b;
public:
	cRectangle();
	cRectangle(float _a, float _b);
	void draw();
	float obwod();
	float pole();
	void resize(float _a, float _b);
private:
};

definicja:

cRectangle::cRectangle() : a(.1), b(.1){}
cRectangle::cRectangle(float _a, float _b) : a(_a), b(_b){}
//void rysuj();
float obwod();
float pole();
void zmienRozmiar(float _a, float _b);


void cRectangle::resize(float w, float h){

	a = a + w;
	b = b + h;
}

void cRectangle::draw()
{
	glPushMatrix();
	glColor3f(red, green, blue);
	glTranslatef(x, y, 0);
	glRotatef(alpha, 0, 0, 1);
	glBegin(GL_POLYGON);
	glVertex2f(-a / 2, b / 2);
	glVertex2f(a / 2, b / 2);
	glVertex2f(a / 2, -b / 2);
	glVertex2f(-a / 2, -b / 2);
	glEnd();
	glPopMatrix();
}

 

1 odpowiedź

+1 głos
odpowiedź 1 kwietnia 2017 przez tangarr Mędrzec (155,180 p.)
wybrane 1 kwietnia 2017 przez heros22pt
 
Najlepsza
Klasa cRectangle posiada przynajmniej jedną niezaimplementowaną metodę wirtualną.
Jeżeli jest to twoja klasa to musisz dopisać brakującą metodę (lub metody).
W przeciwnym wypadku musisz napisać własną klasę bazującą na cRectangle i zaimplementować w niej wymagane metody.
komentarz 1 kwietnia 2017 przez heros22pt Użytkownik (950 p.)

klasa cRectangle:

#ifndef PROSTOKAT_H
#define PROSTOKAT_H
#include<vector>
#include "figura.h"


class cRectangle :public cFigura
{
protected:
	float a, b;
public:
	cRectangle();
	cRectangle(float _a, float _b);
	void draw();
	//float obwod();
	//float pole();
	void resize(float _a, float _b);
private:
};
#endif

oraz jej defonicja

#include<iostream>
#include "prostokat.h"
#include<vector>
#include <GL/freeglut.h>
#include <GL/gl.h>

using namespace std;

cRectangle::cRectangle() : a(.1), b(.1){}
cRectangle::cRectangle(float _a, float _b) : a(_a), b(_b){}
//void rysuj();
//float obwod(){ return 1.0; };
//float pole(){ return 1.0; };
//void zmienRozmiar(float _a, float _b);


void cRectangle::resize(float w, float h){

	a = a + w;
	b = b + h;
}

void cRectangle::draw()
{
	glPushMatrix();
	glColor3f(red, green, blue);
	glTranslatef(x, y, 0);
	glRotatef(alpha, 0, 0, 1);
	glBegin(GL_POLYGON);
	glVertex2f(-a / 2, b / 2);
	glVertex2f(a / 2, b / 2);
	glVertex2f(a / 2, -b / 2);
	glVertex2f(-a / 2, -b / 2);
	glEnd();
	glPopMatrix();
}

 

komentarz 1 kwietnia 2017 przez criss Mędrzec (172,570 p.)
Raczej bardziej by się przydała definicja cFigura, bo tam pewnie jest jakaś metoda czysto wirtualna której nie nadpisałeś w cRectangle.
komentarz 1 kwietnia 2017 przez heros22pt Użytkownik (950 p.)

klasa cFigura

#ifndef FIGURA_H
#define FIGURA_H
using namespace std;
class cFigura
{
protected:   //chroniona
	float x, y;
	int alpha; //kat obotu w stopniach

	float red, green, blue;  //kolor w zakresie 0 do 1
	 
public:
	cFigura();
	//wirtual - metoda wirtualna  - kompilator szuka najbardziej potomnej klasy
	void move(float dx, float dy); //doda wartosc
	void moveTo(int _x, int _y); // zmieni wartos

	void rotate(int dalpha);
	void setColor(float R, float G, float B);
	virtual void resize() = 0; 
	virtual void draw() = 0; 
};

#endif

oraz jej definicja:

#include<iostream>
#include"figura.h"
#include "prostokat.h"
//#include <GL/gl.h>
#include <cmath>


using namespace std;
cFigura::cFigura() :
x(0), y(0), red(1), green(0), blue(0), alpha(0) {
}
void cFigura::move(float dx, float dy){
	x += dx;
	y += dy;
}
void cFigura::rotate(int dalpha){
	alpha += dalpha;
	draw();

}

void cFigura::moveTo(int _x, int _y){
	x = _x;
	y = _y;
	draw();
}


void cFigura::setColor(float R, float G, float B){
	red = red + R;

	green = green + G;

	blue = blue + B;

	if (red > 1)
	{
		red = red - 1;
	}

	if (blue > 1)
	{
		blue = blue - 1;
	}
	if (green > 1)
	{
		green = green - 1;
	}
}

 

komentarz 1 kwietnia 2017 przez criss Mędrzec (172,570 p.)

No i mamy - w klasie cRectangle masz metode resize(float, float), a w cFigura masz resize() = 0. W cRectangle musisz nadpisać dokładnie tą metode, która została zadeklarowana w cFigura jako czysto wirtualna (=0).

Btw. przy deklaracji nadpisywanych metod (np. w cRectangle) dopisuj słowo override - kompilator się zbuntuje jeśli próbujesz nadpisać metode, której nie ma w klasie bazowej, albo nie jest wirtualna i oszczędzi ci problemów takich jak ten.

komentarz 1 kwietnia 2017 przez heros22pt Użytkownik (950 p.)
Dzięki wielkie :D Pewnie siedziałbym następnych parę godzin nad tym i nie zauważyłbym tego. Wielkie Dzięki!!!

Podobne pytania

0 głosów
1 odpowiedź 354 wizyt
pytanie zadane 27 marca 2017 w C i C++ przez Prg Użytkownik (580 p.)
+1 głos
1 odpowiedź 208 wizyt
0 głosów
2 odpowiedzi 528 wizyt
pytanie zadane 12 czerwca 2017 w C i C++ przez Akiro Bywalec (2,910 p.)

93,439 zapytań

142,431 odpowiedzi

322,677 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...