Różna ilość argumentów przy stwarzaniu obiektu danej klasy.

0

Witam, otóż mam pewien problem. Chciałem zrobić mały programik w którym istnieje klasa "Produkt". Klasa ta posiada takie informacje jak nazwa produktu, cena, jednostka, miara. Oraz chciałem zrobić klasę "Przepis", gdzie po stworzeniu obiektu tej klasy, będzie on posiadał w sobie kilka obiektów klasy "Produkt".
Lecz nie wiem za bardzo jak zrobić, żeby np. obiekt "Przepis jajecznica" posiadał w sobie tylko "Produkt Jajka", "Produkt Olej", a np. obiekt "Przepis rogaliki" posiadał w sobie już więcej obiektów typu "Produkt", np. "Produkt jajka", "Produkt twarog", "Produkt maslo", "Produkt maka".

Na chwilę obecną mój kod wygląda tak:

// programv1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>

using namespace std;

class Produkt{
public:
	int cena;
	string nazwa;
	int miara;
	string jednostka;
	Produkt(string nazwa, int cena, int miara, string jednostka);


	void samanazwa(){
		cout << "Nazwa produktu: " << nazwa << endl;
	};
	void samacena(){
		cout << "Cena produktu: " << cena << endl;
	};
	void samamiara(){
		cout << "Miara produktu: " << miara << endl;
	};
	void samajednostka(){
		cout << "Jednostka produktu: " << jednostka << endl;
	};
	void wszystko(){
		cout << "Nazwa produktu: " << nazwa << "    Cena: " << cena << "pln za: " << miara << " " << jednostka << endl;
	}



};




Produkt::Produkt(string nazwa, int cena, int miara, string jednostka)
{
	this->nazwa = nazwa;
	this->cena = cena;
	this->miara = miara;
	this->jednostka = jednostka;
}

Produkt serzolty("ser zolty", 5, 1000, "gram");
Produkt twarog("ser bialy (twarog)", 5, 1000, "gram");
Produkt marmolada("marmolada", 5, 1000, "gram");
Produkt maslo("maslo", 5, 1000, "gram");
Produkt soda("soda", 5, 1000, "gram");



class Przepis{
public: 
	void test(Produkt a){
		cout << a.nazwa; 
	}
};




int _tmain(int argc, _TCHAR* argv[])
{


	serzolty.wszystko();
	twarog.wszystko();
	marmolada.wszystko();
	maslo.wszystko();
	soda.wszystko();
	

	return 0;
}

1

Zrób w klasie przepis listę produktów... list<Produkt>

0
Shalom napisał(a):

Zrób w klasie przepis listę produktów... list<Produkt>

Zmieniłem na:

class Przepis{
public: 
	list<Produkt> proba;
	void test(Produkt a){
		cout << a.nazwa; 
	}
};

Lecz za bardzo nie wiem w jaki sposób zrobić konstruktor do tego, abym tworząc nowy obiekt klasy "Przepis" mógł podać do niego kilka produktów :/ Nigdy jeszcze nie korzystałem z "list".

@Edit

Bo chciałbym ostatecznie mieć możliwość tworzenia obiektów w ten sposób:

Przepis jajecznica(jajka, olej);
Przepis rogaliki(jajka, maslo, twarog, marmolada);
Przepis xxx(produkt1, produkt2, produkt3, ..., produktn);

Ale właśnie nie mam pojęcia jak to osiągnąć :/

0

Takie podejście mija się z celem.
Znaczniej prostszy interfejs wyjdzie dla:

Przepis jajecznica;
jajecznica<<jajka<<olej;
2

Moze cos takiego:

#include <iostream>
#include <algorithm>
#include <initializer_list>
#include <vector>
#include <string>
#include <iterator>
using namespace std;

class Product {
	string name;
	
public:
	Product(string name): name(name) {  }
	
	friend ostream& operator<<(ostream& out, const Product& product) {
		return out << product.name;
	}
};

class Recipe {
	vector<Product> products;
	
public:
	Recipe(const initializer_list<Product>& l) {
		copy(l.begin(), l.end(), back_inserter(products));
	}
	
	friend ostream& operator<<(ostream& out, const Recipe& recipe) {
		out << "Products:\n";
		copy(recipe.products.begin(), recipe.products.end(), ostream_iterator<Product>(out, "\n"));
		return out;
	}
};

int main() {
	Recipe recipe = { Product("banana"), Product("Orange"), Product("Milk") };
	cout << recipe;
	return 0;
}

http://ideone.com/1wCRTO

0

Serdecznie dziękuję za pomoc. Obecnie u mnie wygląda to tak:

// programv1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <list>
#include <algorithm>
#include <initializer_list>
#include <vector>
#include <iterator>

using namespace std;

class Produkt{
public:
	int cena;
	string nazwa;
	int miara;
	string jednostka;
	Produkt(string nazwa, int cena, int miara, string jednostka);

	friend ostream& operator<<(ostream& out, const Produkt& product) {
		return out << product.nazwa;
	}


	void samanazwa(){
		cout << "Nazwa produktu: " << nazwa << endl;
	};
	void samacena(){
		cout << "Cena produktu: " << cena << endl;
	};
	void samamiara(){
		cout << "Miara produktu: " << miara << endl;
	};
	void samajednostka(){
		cout << "Jednostka produktu: " << jednostka << endl;
	};
	void wszystko(int ilosc){
		int i;
		float nowa_cena;
		i = (float)miara / (float)ilosc;
		nowa_cena = (float)cena / (float)i;
		cout << "Nazwa: " << nazwa << " Cena: " << cena << "pln za: " << miara << " " << jednostka << " Cena za potrzebna ilosc: " << nowa_cena << "pln." << endl;
	}
	void potrzebne(int ilosc){
		int i;
		float nowa_cena;
		i = (float)miara / (float)ilosc;
		nowa_cena = (float)cena / (float)i;
		cout << "Cena za " << nazwa << " wynosi " << nowa_cena << "pln za " << ilosc << " " << jednostka << "." <<
			endl;
	}



};




Produkt::Produkt(string nazwa, int cena, int miara, string jednostka)
{
	this->nazwa = nazwa;
	this->cena = cena;
	this->miara = miara;
	this->jednostka = jednostka;
}

Produkt serzolty("ser zolty", 5, 1000, "gram");
Produkt twarog("ser bialy (twarog)", 5, 1000, "gram");
Produkt marmolada("marmolada", 5, 1000, "gram");
Produkt maslo("maslo", 5, 1000, "gram");
Produkt soda("soda", 5, 1000, "gram");
Produkt testuje("test", 5);


class Przepis{
public: 
	vector<Produkt> products;
	Przepis(const initializer_list<Produkt>& l) {
		copy(l.begin(), l.end(), back_inserter(products));
	}

	friend ostream& operator<<(ostream& out, const Przepis& recipe) {
		out << "Lista produktow:\n";
		copy(recipe.products.begin(), recipe.products.end(), ostream_iterator<Produkt>(out, "\n"));
		return out;
	}

};


int _tmain(int argc, _TCHAR* argv[])
{


	serzolty.wszystko(1000);
	twarog.wszystko(250);
	marmolada.wszystko(100);
	maslo.wszystko(500);
	soda.wszystko(200);
	serzolty.potrzebne(500);


	Przepis proba = { serzolty };
	cout << proba;

	return 0;
}

Lecz chciałem się jeszcze zapytać jak to zrobić, aby było zwracana to co znajduje się w:

void potrzebne(int ilosc)

zamiast samej nazwy produktu?
Ponieważ wiem, że można pozmieniać tutaj:

return out << product.nazwa << product.cena;

Tylko nie wiem jak można w tym miejscu wykorzystać tą funkcję "potrzebne" :/ Bo chciałbym mieć jeden obiekt klasy np. "serzolty" i tylko podawać ile gram mi jest jego potrzebnych, i żeby była wtedy zwracana cena za daną ilość gram.

0

To friend ostream& operator<<(ostream& out, const Produkt& product) { odpowiada za wyświetlenie jednego produktu.

0

Tylko nie wiem jak wykorzystać ten fakt, że to odpowiada za wyświetlanie jednego produktu, ponieważ chcę zrobić coś takiego:

Przepis rogaliki = { (twarog, 500), (marmolada,800), (maslo,600) };

Albo np.

Przepis rogaliki = {twarog.potrzebne(500), marmolada.potrzebne(800), maslo.potrzebne(600) };

Chciałbym podawać ilość gram/sztuk/mililitrów itp danego produktu. (Fakt, że w razie czego można zawsze tworząc nowy obiekt tam podawać po prostu wagę/ilość, ale chciałbym tego uniknąć, aby nie robić nowego obiektu dla twarogu, który waży 250g, nowego dla tego który waży 200g itp.)

0

Dodaj klase Skladnik zawierajaca 3 pola: Produkt, Ilosc, Jednostka. Zdefiniuj operator wyjsciowy strumienia do wyswietlania, a nastepnie podmien w klasie Przepis vector produktow na vector skladnikow.

Mozesz tez uzyc... buildera co jest duzo lepszym wyjsciem.

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