• 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++

Object Storage Arubacloud
+1 głos
404 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 (212,670 p.)

Pokaż klasę cRectangle.

komentarz 1 kwietnia 2017 przez mokrowski Mędrzec (155,460 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 (154,780 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,590 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,590 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ź 211 wizyt
pytanie zadane 27 marca 2017 w C i C++ przez Prg Użytkownik (580 p.)
+1 głos
1 odpowiedź 164 wizyt
0 głosów
2 odpowiedzi 335 wizyt
pytanie zadane 12 czerwca 2017 w C i C++ przez Akiro Bywalec (2,910 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...