• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Funkcja dodajaca elementy bedace wskaznikiem na klase bazowa do vectora

VPS Starter Arubacloud
0 głosów
296 wizyt
pytanie zadane 23 marca 2019 w C i C++ przez Zielony12 Nowicjusz (200 p.)
zamknięte 2 kwietnia 2019 przez Zielony12

Gdy dodaje przykładowy element to wyświetla mi jego adres, a nie prawdziwa nazwe i wlasnosci.Klasa Squaree na pewno jest zaimplementowana w odpowiedni sposób i działa.

ShapeContainer.hpp

class ShapeContainer : public Shapee
{
	std::vector<Shapee*> shapes;
public:
	ShapeContainer();
	~ShapeContainer() {};
	void add(Shapee*);
	void displayAll() const;
	
};

ShapeContainer.cpp

void ShapeContainer::add(Shapee*) {

	Shapee *figura = new Rectanglee("x", 10,5);
	shapes.push_back(figura);
}
void ShapeContainer::displayAll() const
{
	for (Shapee* f : shapes) {
		std::cout << f;
	}
}
Shapee::Shapee(std::string name) { this->name = name; std::cout << "\nWywolano konstruktor klasy Shape " << std::endl; };
Shapee::~Shapee() { std::cout << "\nWywolano destruktor klasy Shape " << std::endl; };
void Shapee::setName(std::string name) { this->name = name; };
ShapeContainer::ShapeContainer() : Shapee(name) { std::cout << "\nWywolano konstruktor klasy ShapeContainer"; };

main.cpp

void ex2()
{
	ShapeContainer x;
	Squaree *z = new Squaree("kwadrat", 10);
	x.add(z);
	std::cout << "Zawartosc kolekcji figur: ";
	x.displayAll();
	delete z;
}

 

komentarz zamknięcia: Otrzymalem odpowiedz

1 odpowiedź

0 głosów
odpowiedź 23 marca 2019 przez j23 Mędrzec (194,920 p.)
wybrane 2 kwietnia 2019 przez Zielony12
 
Najlepsza
 for (Shapee* f : shapes) {
        std::cout << *f;
    }

To zadziała pod warunkiem, że masz zrobiony operator << dla klasy Shapee.

komentarz 23 marca 2019 przez Zielony12 Nowicjusz (200 p.)

Dzieki, ale tez wlasnie sie zorientowalem. Teraz mam inny problem, a mianowicie.

void ShapeContainer::add(Shapee*) {

	Squaree *figura = new Squaree("kwadrat",5);
	shapes.push_back(figura);

 A mam jeszcze jedno pytanie, w jaki sposob sformulowac metode area i perimeter zeby zwracalo rzeczywiste wyniki odpowiednio pola i obwodu figur? I w jaki sposob sformulowac powyzsza linijke aby moc dodawac figury kazdego typu?

class Shapee 
{
protected:
	std::string name;
public:
	Shapee(std::string name);
	~Shapee();
	void setName(std::string name);
	std::string getName();
	double area() { return 0; };
	double perimeter() { return 0; };
};
void ShapeContainer::displayAll() const
{
	for (Shapee* f : shapes) {
		std::cout << "Pole i obwod figury o nazwie " <<"'"<< f->getName()<< "'" << " = " << f->area() << " , " << f->perimeter() << std::endl;
	}
}

 

komentarz 23 marca 2019 przez j23 Mędrzec (194,920 p.)

w jaki sposob sformulowac metode area i perimeter zeby  (...)

Zrób je wirtualnymi (zakładają, że klasy pochodne mają odpowiednie implementacje tych metod).

I w jaki sposob sformulowac powyzsza linijke

Powyższa linijka to trzy linijki. Nie bardzo rozumiem, co chcesz osiągnąć. add w parametrze dostaje wskaźnik, który powinieneś dodać do vectora. Nie wiem, po co tworzysz tam obiekt Squaree.

komentarz 23 marca 2019 przez Zielony12 Nowicjusz (200 p.)
class Shapee 
{
protected:
	std::string name;
public:
	Shapee(std::string name);
	~Shapee();
	void setName(std::string name);
	std::string getName();
	virtual double area()=0;
	virtual double perimeter()= 0;
};

Zmienilem te metody na wirtualne, a co do drugiej czesci to w jaki sposob moglaby wygladac ta funkcja add?

Przykladowa implementacja funkcji perimeter i area dla Rectanglee.

double Rectanglee::perimeter() { std::cout << "Obwod prostokata: "; return (2* this->width + 2*this->height); };
double Rectanglee::area() { std::cout << "Pole prostokata: "; return this->width * this->height; };
ShapeContainer x;
	Squaree kw("kwadrat", 10);
	Squaree z("z", 5);
	x.add(&kw);
	x.add(&z);
	std::cout << "Zawartosc kolekcji figur: ";
	x.displayAll();

Ważność	Kod	Opis	Projekt	Plik	Wiersz	Stan pominięcia
Błąd	C2259	"ShapeContainer": nie można utworzyć instancji klasy abstrakcyjnej	JiPP_4	c:\users\buczeq\source\repos\jipp_4\jipp_4\jipp_4.cpp	26	

Gdy utworze metody wirtualne w mainie nie bede mogl skorzystac z metod skladowych klasy ShapeContainer.

1
komentarz 23 marca 2019 przez j23 Mędrzec (194,920 p.)
edycja 23 marca 2019 przez j23

w jaki sposob moglaby wygladac ta funkcja add?

void ShapeContainer::add(Shapee *figura) 
{
        shapes.push_back(figura);
}

Gdy utworze metody wirtualne (...)

To po co tworzysz takie metody w ShapeContainer, skoro nie musisz? Wcześniej mowa był a o klasie Shapee i jej pochodnych, bo masz tu do czynienia z polimorfizmem.

--- dodane --

Nie zauważyłem, że ShapeContainer też dziedziczy po Shapee. Tak czy siak, jeśli metoda add ma być dostępna z poziomu klasy Shapee, wtedy musi być w niej zdefiniowana jako wirtualna (niezbyt dobry pomysł IMO).

 

Dodaj implementacje do ShapeContainer i będzie git:

class ShapeContainer: public Shapee
{
    ....
    virtual double area() { return 0; }
    virtual double perimeter() { return 0; }
};

 

komentarz 24 marca 2019 przez Zielony12 Nowicjusz (200 p.)
Dzieki wielkie, dziala. A dlaczego trzeba dodac do ShapeContainer po raz 2 metode wirtualna? Da sie to jakos latwo wytlumaczyc? :)
komentarz 24 marca 2019 przez j23 Mędrzec (194,920 p.)

Da się. Obie metody w klasie Shapee są zadeklarowane jako pure virtual, a tego typu metody muszą być gdzieś zaimplementowane, żeby można było stworzyć instancję klasy.

Podobne pytania

0 głosów
2 odpowiedzi 159 wizyt
0 głosów
5 odpowiedzi 1,874 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...