Klasy zagnieżdżone a wywołanie obiektu

Klasy zagnieżdżone a wywołanie obiektu
RM
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Wieluń
  • Postów:2
0

Napisałem taki kod:

Kopiuj
#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:

Kopiuj
 
    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ł?

Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:ponad rok
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?


"(...) otherwise, the behavior is undefined".
RM
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Wieluń
  • Postów:2
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.