Cześć bawię się klasami i kontenerami, jako że uczę się tego na studia muszę robić to zgodnie ze standardami nauczycieli artefaktów nie używać "for Range". Wiem że to dla mojego dobra dla tego ostro ćwiczę by ogarniać.
Teraz zastanawiam się w jaki sposób wyświetlić kontener w klasie bazowej - przy okazji co robię źle i może co poprawić :P gównie chodzi o main i metode - wyswietlkontener() ale wszelkie info i propozycje tyczące się dziedziczenia i budowy klas też będą mile widziane.
Ma ona wyświetlać pole i obwód klas zapisanych w kontenerze.
- Pytanie czy
//Z tego co rozumiem to tutaj przekazuje do kontenera adres na klasę ?
Kwadrat * kw = new Kwadrat(2, "FajnyK");
bf.dodajdokontenera(kw);
//Jakbym zrobił tak robię to samo.
bf.dodajdokontenera(new Kwadrat(2, "FajnyK"));
- Rozumiem że w wyswietlkonterner() dostaje adres na klasę bazową w której znajduje się kontener i teraz muszę tak wyciągnąć dane by móc pracować i wyświetlać je z kontenera - i tu mam problem, a może i wcześniej coś zmienić bo inaczej powinienem to przekazać itp. itd.
void wyswietlkontener(BazaFigur & b) {
vector<BazaFigur*>::iterator it;
for (it=(b.kontenerfigur).begin(); it!=(b.kontenerfigur).end(); it++) {
cout << *it << endl;
}
}
main.cpp
#include <iostream>
#include "bazafigur.h"
using namespace std;
int main() {
BazaFigur bf;
Kwadrat * kw = new Kwadrat(2, "FajnyK");
Prostokat * pr = new Prostokat(2, 3, "FajnyP");
Kolo * ko = new Kolo(2, "FajnyKo");
Trojkat * tr = new Trojkat(2, 3, "FajnyTr");
bf.dodajdokontenera(kw);
bf.dodajdokontenera(pr);
bf.dodajdokontenera(ko);
bf.dodajdokontenera(tr);
bf.wyswietlkontener(bf);
return 0;
}
bazafigur.h
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
const double pi = 3.14;
using namespace std;
class BazaFigur {
protected:
string nazwa;
vector<BazaFigur*>kontenerfigur;
public:
BazaFigur(){
}
BazaFigur(string nazwa): nazwa(nazwa){
cout << "Tworze (obiekt) figure " << nazwa << endl;
}
virtual ~BazaFigur() {
for (BazaFigur * b : kontenerfigur) {
delete b;
}
cout << "Zegnaj " << nazwa << endl;
}
virtual double pole() {
return 0;
}
virtual double obwod() {
return 0;
}
void dodajdokontenera(BazaFigur * b) {
kontenerfigur.push_back(b);
}
void wyswietlkontener(BazaFigur & b) {
vector<BazaFigur*>::iterator it;
for (it=(b.kontenerfigur).begin(); it!=(b.kontenerfigur).end(); it++) {
cout << *it << endl;
}
}
};
class Kwadrat : public BazaFigur {
protected:
double a;
public:
Kwadrat(double a, string nazwa) : BazaFigur(nazwa), a(a) {
cout << "Tworze (obiekt) kwadrat " << nazwa << endl;
}
~Kwadrat() {
cout << "Zegnaj (obiekt) kwadrat " << nazwa << endl;
}
virtual double pole() {
return a*a;
}
virtual double obwod() {
return a * 4;
}
};
class Prostokat : public Kwadrat {
protected:
double b;
public:
Prostokat(double b, double a, string nazwa) : Kwadrat(a, nazwa), b(b) {
cout << "Tworze (obiekt) prostokat " << nazwa << endl;
}
~Prostokat() {
cout << "Zegnaj (obiekt) prostokat " << nazwa << endl;
}
virtual double pole() {
return a * b;
}
virtual double obwod() {
return (2 * a) + (2 * b);
}
};
class Kolo : public BazaFigur {
protected:
double r;
public:
Kolo(double r, string nazwa) : BazaFigur(nazwa), r(r) {
cout << "Tworze (obiekt) kolo " << nazwa << endl;
}
~Kolo() {
cout << "Zegnaj (obiekt) kolo " << nazwa << endl;
}
virtual double pole() {
return pi * pow(r, 2);
}
virtual double obwod() {
return 2 * pi * r;
}
};
class Trojkat : public Kolo {
protected:
double h;
public:
Trojkat(double h, double r, string nazwa) : Kolo(r, nazwa), h(h) {
cout << "Tworze (obiekt) trojkat " << nazwa << endl;
}
~Trojkat() {
cout << "Zegnaj (obiekt) trojkat " << nazwa << endl;
}
virtual double pole() {
return 1 / 2 * r*h;
}
virtual double obwod() {
return h*2;
}
};
Z góry dzięki za pomoc! Jak przez to przebrnę, przebije pewną barierę mentalna na temat wskaźników i klas :P