Załadowanie pliku tekstowego. Polimorfizm.

0
#include "pch.h"
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;


class Figura
{
protected:
	char nazwa[50];
	char obwod[10];
	char pole[10];
public:
	Figura(const char *x);
	virtual void Nazwa() = 0;
	virtual void Obwod() = 0;
	virtual void Pole() = 0;
};

Figura::Figura(const char *x)
{
	strcpy_s(nazwa, x);
}



void Figura::Nazwa()
{
	printf("nazwa figury to %s \n", nazwa);
}



//________________________________________________________________________________________

class Prostokat : public Figura
{
	double a;
	double b;
public:
	Prostokat(double a, double b) :Figura("Prostokat"), a(a), b(b) {}
	virtual void Nazwa();
	virtual void Obwod();
	virtual void Pole();
};



void Prostokat::Nazwa()
{
	printf("nazwa figury to %s \n", nazwa);
}

void Prostokat::Obwod()
{
	cout << "obwod prostokata to" << 2 * a + 2 * b << endl;
}
void Prostokat::Pole()
{
	cout << "pole prostokata to" << a * b << endl;
}


//________________________________________________________________________________________


class Kolo : public Figura
{
	double r;

public:
	Kolo(double r) :Figura("Kolo"), r(r) {}
	virtual void Nazwa();
	virtual void Obwod();
	virtual void Pole();
};


void Kolo::Nazwa()
{
	printf("nazwa figury to %s \n", nazwa);
}
void Kolo::Obwod()
{
	cout << "obwod kola to \t" << 3.14 * 2 * r << endl;
}
void Kolo::Pole()
{
	cout << "pole kola to \t" << 3.14*r*r << endl;
}







int main()
{
	const int ile = 5;
	Figura *figura[ile] = {};

	figura[0] = new Kolo(5);


	string linia;
	int nr = 1;
	fstream plik;
	plik.open("liczby.txt", ios::in);
	if (plik.good() = false)
		cout << "blad otwarcia pliku";
	while (getline(plik, linia))
	{
		switch (nr)
		{
		case 1: nazwa = linia; break;
		case 2: r = atoi(linia.c_str()); break;
		case 3: nazwa = linia; break;
		case 4: a = atoi(linia.c_str());; break;
		case 5: b = atoi(linia.c_str());; break;
		}
		nr++;
	}

	plik.close()





	for (int i = 0; i < ile; i++)
	{
		figura[i]->Nazwa();
		figura[i]->Obwod();
		figura[i]->Pole();
	}

	for (int i = 0; i < ile; i++)
	{
		if (figura[i])
			delete figura[i];
	}

	_getch();
	return 0;

}

Plik tekstowy wygląda tak:
Kolo
4
Prostokat
5
8

W jaki sposób załadować ten plik do programu, a następnie stworzyć jedną tablicę, która przechowuje wszytskie obiekty figur jednoczesnie?
Jak nastepnie w jednej pętli wyświetlić listę figur, uwzględniając jej nazwę, obwód i pole?

0
  1. Metody void drukujące a nie zwracające wartości to jedna ze zmór szkolnych projektów. Narusza to zasady rozdzielenia odpowiedzialności, obiekt figura ma realizować figurę, getter mają zwracać wartości a nie zajmować się drukowaniem. Drukować ma kod kliencki.

  2. Dlaczego obwód i pole są char[n] to nie wiem. Co więcej nie biorą udziału w drukowaniu wyniku.

  3. Aby tablica mogła przyjmować klasy potomne, musi być tablicą wskaźników lub referencji, czyli Figura * albo Figura &

  4. Wczytywanie danych z pliku od 1 do 6 świadczy o bardzo sztywnej wizji. Powinno być wczytanie nazwy, potem w zależności od nazwy

Figura * f = new Koło(); // konstruktor bezparametrowy
f->Wczytaj(fstream )

Kazda figura musi umieć "połknąć" z fstream tyle liczb, ile ją charakteryzuje, trapez chyba ok 4ch. Tylko ona wie ile.
Ja bym z tego uczynił metodę abstrakcyjną. Można mieć inną wizję tego, ale taka jest OK w segmencie prostych szkolnych projektów

0

Bardzo dziękuję za odpowiedź.
Czy mogłabym poprosić o kawałek gotowego kodu jeśli chodzi o wczytywanie tych danych?
Niestety nie potrafię sobie z tym poradzić.

0
std::string name;

while (plik >> name) {
	if (name == "Kolo") {
		double r;
		if (plik >> r) {
			figura[nr++] = new Kolo(r);
		}
		continue;
	}

	if (name == "Prostokat") {
		double a, b;
		if (plik >> a >> b) {
			figura[nr++] = new Prostokat(a, b);
		}
		continue;
	}
}
0
    fstream plik;
    plik.open("liczby.txt", ios::in);
    if (plik.good() = false)
        cout << "blad otwarcia pliku";
    
std::string name;

while (plik >> name) {
    if (name == "Kolo") {
        double r;
        if (plik >> r) {
            figura[nr++] = new Kolo(r);
        }
        continue;
    }

    if (name == "Prostokat") {
        double a, b;
        if (plik >> a >> b) {
            figura[nr++] = new Prostokat(a, b);
        }
        continue;
    }
}
plik.close();

Czy teraz będzie to poprawnie?

0
std::ifstream plik("liczby.txt");
if (!plik.is_open()) {
        std::cout << "blad otwarcia pliku\n";
        return -1;
}
0

Bardzo dziękuję za pomoc.

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