Klasy zagnieżdżone a wywołanie obiektu

0

Napisałem taki kod:

#include <iostream>
#include <math.h>
#include <cstdlib>
using namespace std;

class Figura {
    int menu;
public:
    Figura();

    // Obiekt Kolo
	class Kolo {
	    double r;
	public:
		Kolo(double promien): r(promien) {} // Konstruktor
		double pole() { return M_PI*r*r; }
		double obwod() { return 2*M_PI*r; }
	};

    // Obiekt Trojkat
	class Trojkat {
	    double a,b,c,h;
	public:
		Trojkat(double a, double b, double c, double h): a(a), b(b), c(c), h(h) {} // Konstruktor
		double pole() { return ((a*h)/2); }
		double obwod() { return a+b+c; }
	};

    // Obiekt Kwadrat
	class Kwadrat {
	    double a;
	public:
		Kwadrat(double a): a(a) {} // Konstruktor
		double pole() { return a*a; }
		double obwod() { return 4*a; }
	};

	~Figura();
};

int Menu() {
    int menu;
    cout << "MENU:" << endl;
    cout << "1-Kolo" << endl;
    cout << "2-Trojkat" << endl;
    cout << "3-Kwadrat" << endl;
    cout << "Wybierz figure: " << endl;

    cin >> menu;
    system("cls");
    return menu;
}

string nazwaFigury(int typFigury) {
    string nazwa;

    switch (typFigury) {
        case 1: nazwa = "Kolo"; break;
        case 2: nazwa = "Trojkat"; break;
        case 3: nazwa = "Kwadrat"; break;
    }
    return nazwa;
}

int main() {
    int typFigury = Menu();

    switch (typFigury) {
        case 1: {
            double r;
            cout << "Podaj promien: ";
            cin >> r;
            Figura::Kolo figurka(r);
        } break;

        case 2: {
            double a,b,c,h;
            cout << "Podaj kolejno: podstawe, ramie1, ramie2, wysokosc: ";
            cin >> a >> b >> c >> h;
            Figura::Trojkat figurka(a,b,c,h);
        } break;

        case 3: {
            double a;
            cout << "Podaj dlugosc boku: ";
            cin >> a;
            Figura::Kwadrat figurka(a);
        } break;

        default: cout << "Podano zly typ figury."; break;
    }

    cout << "Wybrano " << nazwaFigury(typFigury) << endl;
    cout << "Pole: " << figurka.pole() << endl;
    cout << "Obwod: " << figurka.obwod() << endl;

	return 0;
}

jednak 5 linijka od końca, tj:

 
    cout << "Pole: " << figurka.pole() << endl;

wywołuje mi błąd:
figurka.pole() was not declared in this scope.
nie wiem już jak to obejść, ale koniecznie chcę, abym mógł deklarować ten obiekt poprzez switch i wywoływać później figurka.pole() chociaż mniej więcej tak jak to próbuje tu zrobić. Ma ktoś jakiś pomysł?

1

Robisz to źle.™

Takie coś realizuje się za pomocą polimorfizmu. Potrzebna jest bazowa i abstrakcyjna klasa Figura z virtualnymi metodami pole(), obwód() itd, a poszczególne figury powinny z niej dziedziczyć. Potem pytasz użytkownika co stworzyć i robisz to za pomocą new albo smart pointerów. Żeby to ułatwić stosuje się fabryki, ale to na potem.

Dlaczego wybrałeś taki sposób implementacji tego?

0

Dzięki, pokombinowałem z metodami wirtualnymi i śmiga ;)

0 użytkowników online, w tym zalogowanych: 0, gości: 0