Šta je novo?

C++

Logen

Slavan
Učlanjen(a)
20.12.2009
Poruke
1,677
Poena
375
Moja oprema  
Laptop
Macbook Air M1
Mobilni telefon
iPhone 14 Pro
Pristup internetu
  1. Optički internet
Imam problem sa ovim zadatkom:
Na programskom jeziku C++ kreirati klasu Skladiste koja od privatnih atributa sadrži maksimalni kapacitet u kg (double), broj elemenata niza i niz pointera na objekte klase Element. Klasa sadrži i sledeće javne funkcije:
• konstruktor koji postavlja maksimalni kapacitet, broj elemenata niza i zauzima potreban prostor u memoriji
• destruktor
• funkciju za dodavanje jednog elementa u niz ako time ukupna količina materijala ne prevazilazi maksimalnu vrednost
• funkciju za određivanje ukupne količine materijala u skladištu
• funkciju koja štampa listu šifara svih materijala koji su uskladišteni (svaku šifru štampati po jednom)
• prijateljsku operatorsku funkciju << za štampanje liste elemenata u skladištu uredjenu u rastući niz po šifri materijala.

Kreirati klasu Element koja od zaštićenih atributa sadrži šifru (int), šifru materijala (int) i količinu (float), a od javnih funkcija:
• funkciju koja vraća šifru materijala,
• funkciju koja vraća količinu materijala
• čistu virtuelnu funkciju za štampanje podataka o elementu
• operatorsku funkciju za upoređivanje dva elementa (po šifri)

Kreirati klasu Paleta koja je javno izvedena iz klase Element,koja od privatnih atributa sadrži lot kod (niz karaktera) i tip („pck“ za paket, „silo“ za silos). Od javnih metoda sadrži:
• konstruktor koji postavlja sve atribute
• operator >> za unos podataka o paleti

U funkciji main napraviti skladište, napraviti nekoliko paketa i silosa i dodati ih skladištu. Zatim odrediti ukupnu količinu materijala u skladištu, odštampati listu šifara svih materijala koji se javljaju u skladištu i odštampati listu svih paketa i silosa.

Evo i mog koda:
Kod:
//skladiste.h
#include <iostream>
using namespace std;  

class element
{
protected:
	int sifra,sifmat;
	float kolicina;
public:
	int vratis();
	float vratik();
	virtual void stampaj()=0;
	element& operator>(element& k);
};

class paleta:public element
{
private:
	char lotkod[10];
	char tip[4];
public:
	paleta(char k[],char tip[]);
	istream& operator>>(istream& in);
};

class skladiste
{
private:
	double maxkg;
	int brniz;
	element* niz;
public:
	skladiste(double k,int n);
	~skladiste();
	void dodaj();
	float odredi();
	void stampaj();
	friend ostream& operator<<(ostream& out,skladiste& k);
};

Kod:
//.cpp
#include "skladiste.h"
#include <iostream>
using namespace std;

skladiste::skladiste(double k, int n)
{
	this->maxkg=k;
	this->brniz=n;
	this->niz=new element[n];
}
skladiste::~skladiste()
{
	delete[] niz;
}

void skladiste::dodaj()
{
	float ukkol=0;
	for(int i=0;i<this->brniz;i++)
		ukkol=niz[i].kolicina+ukkol;
	if(ukkol>=maxkg)
		cout<<"Nema dovoljno mesta";
	else 
		cin>>niz->sifra>>niz->sifmat>>niz->kolicina;
}
float skladiste::odredi()
{
	float ukkol=0;
	for(int i=0;i<this->brniz;i++)
		ukkol=niz[i].kolicina+ukkol;
	return ukkol;
}
void skladiste::stampaj()
{
	cout<<niz->sifra;
}
ostream& operator <<(ostream& out,skladiste& k)
{
	int min;
	for(int i=0;i<k.brniz-1;i++)
	{
		for(int j=i+1;j<k.brniz;j++)
		{
			 min=k.niz[i].sifmat;
			if(min>k.niz[j].sifmat)
				min=k.niz[j].sifmat;
		}
		out<<min;
	}
	return out;
}

float element::vratik()
{
	return(this->kolicina);
}
int element::vratis()
{
	return(this->sifmat);
}
element& element::operator >(element &k)
{
	if(this->sifmat>k.sifmat)
		return k;
	else return *this;
}
paleta::paleta(char k[], char tip[])
{
	strcpy(this->lotkod,k);
	strcpy(this->tip,tip);
}
istream& paleta::operator >>(istream &in)
{
	in>>this->lotkod;
	in>>this->tip;
	return in;
}

Problem je sto mi izbacuje greske, tj. ne daje mi da pristupam protected atributima element klase iako sam napravio niz koji ukazuje na tu klasu. Ako neko moze da mi pokaze gde gresim...
 
Nisi uradio domaci kako valja i procitao o privilegijama pristupa atributima klase. :)

Elem, ne mozes pristupati atributima objektima jedne klase direktno van funkcija te klase ukoliko su private ili protected. Ukoliko zelis da menjas npr. kolicinu objektu element iz klase skladiste, moras da napravis funkciju npr. void setKolicina(int n) koja ce biti public i uz pomoc nje postavljati kolicinu ili int getKolicina() koja ce vracati vrednost tog atributa.

Drugo resenje je da ih prebacis da budu public, ali to nije praksa. Nema to veze da li su ti objekti elemenata u nizu ili nisu, to je samo struktura.
 
Ok. A zasto mi je navedeno da napravim cistu virtuelnu funkciju(apstraktnu klasu) a nigde mi nije navedeno da tu funkciju redefinisem u nasledjenoj klasi? I da, ne mogu da rezervisem memoriju za niz pokazivaca koji ukazuju na klasu element jer je ona apstraktna. Ne znam kako to da izvedem...

I ako moze primer kako da izvadim privatni atribut jedne klase i da ga ubacim u drugu.
 
Poslednja izmena:
• funkciju koja vraća šifru materijala,
• funkciju koja vraća količinu materijala

Pise ti :) . Ne moras da je redefinises za paletu, ovakva kakva je moze se koristiti za bilo koju klasu koja je izvedena iz nje. Apstraktna klasa je ona koja ima bar jednu cistu virtuelnu funkciju, ne sve. Nisam odmah zapazio da je apstraktna, ali to ne menja ono sto sam rekao.

Primer funkcije koja vraca kolicinu:
Kod:
int Element::getKolicina()
{
  return this->kolicina;
}

Primer (bilo gde van klase):
Paleta p(<parametri>);
int k = p.getKolicina();

Mislim, mogu ja jednostavnije od ovoga da objasnim, ali ovo su osnovne stvari, imas mnooogo literature na ovu temu.
 
Odradio sam to i ostali su mi samo ovaj niz pokazivaca na obekat klase element. Ne mogu da rezervisem memoriju za njega jer je apstraktna klasa i ne mogu da mu pristupim tj, da pisem u njegovim atributima.
 
Resio sam ovo tako sto sam napravio pointer na pointer
 
Nazad
Vrh Dno