Permalänk

Hjälp med c++, klasser.

Hej! Jag har fått en skoluppgift där jag ska göra en enkel godisautomat. Den ska inte ta pengar utan bara visa antal varor och låta användaren ta ut varor. Det ser ut såhär

main

#include <iostream> #include "automatVara.h" using namespace std; void sell(automatVara&); void menu(); int main() { automatVara Japp(5); automatVara Snickers(4); automatVara Twix(3); automatVara Dajm(6); menu(); int choice; cin >> choice; while (choice != 9) { switch (choice) { case 1: sell(Japp); break; case 2: sell(Snickers); break; case 3: sell(Twix); break; case 4: sell(Dajm); break; default: cout << "Välj mellan 1, 2, 3 och 4" << endl; break; } menu(); cin >> choice; } return 0; } void menu() { cout << "Lucka nr 1: Japp. Antal:" << endl; cout << "Lucka nr 2: Snickers. Antal:" << endl; cout << "Lucka nr 3: Twix. Antal:" << endl; cout << "Lucka nr 4: Dajm. Antal:" << endl; cout << "Skriv in numret på varan du vill ha, avsluta med 9" << endl; } void sell(automatVara& produkt) { if (produkt.HamtaAntalVaror() > 0) { produkt.makeSale(); cout << "Varsegod!" << endl; } else cout << "Den varan är slut" << endl; }

automatVara.h

class automatVara { public: int HamtaAntalVaror (); void makeSale (); private: int antalVaror; };

automatVara.cpp

#include <iostream> #include "automatVara.h" using namespace std; int automatVara::HamtaAntalVaror() { return antalVaror; } void automatVara::makeSale() { antalVaror--; }

Når inte main fram till klassen eller? Uppskattar all hjälp på vägen ni kan ge!

||=== Build: Debug in Godisautomat (compiler: GNU GCC Compiler) ===| D:\programmering\Godisautomat\main.cpp||In function 'int main()':| D:\programmering\Godisautomat\main.cpp|10|error: no matching function for call to 'automatVara::automatVara(int)'| D:\programmering\Godisautomat\main.cpp|10|note: candidates are:| include\automatVara.h|1|note: automatVara::automatVara()| include\automatVara.h|1|note: candidate expects 0 arguments, 1 provided| include\automatVara.h|1|note: automatVara::automatVara(const automatVara&)| include\automatVara.h|1|note: no known conversion for argument 1 from 'int' to 'const automatVara&'| D:\programmering\Godisautomat\main.cpp|11|error: no matching function for call to 'automatVara::automatVara(int)'| D:\programmering\Godisautomat\main.cpp|11|note: candidates are:| include\automatVara.h|1|note: automatVara::automatVara()| include\automatVara.h|1|note: candidate expects 0 arguments, 1 provided| include\automatVara.h|1|note: automatVara::automatVara(const automatVara&)| include\automatVara.h|1|note: no known conversion for argument 1 from 'int' to 'const automatVara&'| D:\programmering\Godisautomat\main.cpp|12|error: no matching function for call to 'automatVara::automatVara(int)'| D:\programmering\Godisautomat\main.cpp|12|note: candidates are:| include\automatVara.h|1|note: automatVara::automatVara()| include\automatVara.h|1|note: candidate expects 0 arguments, 1 provided| include\automatVara.h|1|note: automatVara::automatVara(const automatVara&)| include\automatVara.h|1|note: no known conversion for argument 1 from 'int' to 'const automatVara&'| D:\programmering\Godisautomat\main.cpp|13|error: no matching function for call to 'automatVara::automatVara(int)'| D:\programmering\Godisautomat\main.cpp|13|note: candidates are:| include\automatVara.h|1|note: automatVara::automatVara()| include\automatVara.h|1|note: candidate expects 0 arguments, 1 provided| include\automatVara.h|1|note: automatVara::automatVara(const automatVara&)| include\automatVara.h|1|note: no known conversion for argument 1 from 'int' to 'const automatVara&'| ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Permalänk
Medlem

Nu var det ju länge sen jag satt med C++, men det kan inte vara att du först definierat automatVara& och sen automatVara? Att den inte hittar den variabeln därav?

Visa signatur

Gigabyte GA-Z77X-UP7 | i7 3770K 3.5 GHz | Crucial Ballistix Elite DDR3 1600 MHz 4x4 GB | Crucial M500 240GB SSD | Seagate Desktop 3TB 7200rpm 64MB | Corsair H80i | Gigabyte GTX 970 Windforce G1 Gaming 4GB SLI | BitFenix Ronin | Be-Quiet Dark Power Pro 10 750 W | Asus Xonar Essence STX
Inet Fraktfritt

Permalänk
Medlem

Annars har du en bra hemsida här som kan hjälpa till med det mesta: http://www.cplusplus.com/

Visa signatur

Gigabyte GA-Z77X-UP7 | i7 3770K 3.5 GHz | Crucial Ballistix Elite DDR3 1600 MHz 4x4 GB | Crucial M500 240GB SSD | Seagate Desktop 3TB 7200rpm 64MB | Corsair H80i | Gigabyte GTX 970 Windforce G1 Gaming 4GB SLI | BitFenix Ronin | Be-Quiet Dark Power Pro 10 750 W | Asus Xonar Essence STX
Inet Fraktfritt

Permalänk
Medlem

Du behöver definiera en "constructor" i klassen "automatVara". Du kan läsa om det en liten bit ner på denna sidan: http://www.cplusplus.com/doc/tutorial/classes/

Edit: Gissningsvis vill du göra något i stil med:

automatVara.h

class automatVara { public: automatVara(int); int HamtaAntalVaror (); void makeSale (); private: int antalVaror; };

automatVara.cpp

#include <iostream> #include "automatVara.h" using namespace std; automatVara::automatVara(int antal){ antalVaror=antal; } int automatVara::HamtaAntalVaror() { return antalVaror; } void automatVara::makeSale() { antalVaror--; }

Bytt ut [\code] mot [/code]
Permalänk

Vad dessa sa. Anrop på rad 10, 11, 12 samt 13 i main.cpp tar inte de argumenten

Permalänk

Tackar för hjälpen! ska kika på länken du skicka!

Permalänk

Nu fungerar det som det ska. Men skulle jag kunna baka in

automatVara Japp(5); automatVara Snickers(4); automatVara Twix(3); automatVara Dajm(6);

i typ en funktion? Är det ful kodning att låta det vara där det är? nådde inte ut hämtaantalvaror i menyn när jag hade det liggandes i main, därför flyttade jag upp den.

#include <iostream> #include "automatVara.h" using namespace std; automatVara Japp(5); automatVara Snickers(4); automatVara Twix(3); automatVara Dajm(6); void salj(automatVara&); void meny(); int main() { meny(); int choice; cin >> choice; while (choice != 9) { switch (choice) { case 1: salj(Japp); break; case 2: salj(Snickers); break; case 3: salj(Twix); break; case 4: salj(Dajm); break; default: cout << "Välj mellan 1, 2, 3, 4 och 9 för att avsluta" << endl; break; } meny(); cin >> choice; } return 0; } void meny() { cout << "Lucka nr 1: Japp. Antal:" << Japp.HamtaAntalVaror() << endl; cout << "Lucka nr 2: Snickers. Antal:" << Snickers.HamtaAntalVaror() << endl; cout << "Lucka nr 3: Twix. Antal:" << Twix.HamtaAntalVaror() << endl; cout << "Lucka nr 4: Dajm. Antal:" << Dajm.HamtaAntalVaror() << endl; cout << "Skriv in numret på varan du vill ha, avsluta med 9" << endl; } void salj(automatVara& produkt) { if (produkt.HamtaAntalVaror() > 0) { produkt.saljVara(); cout << "Varsegod!" << endl; } else cout << "Den varan är slut" << endl; }

automatVara.cpp

#include <iostream> #include "automatVara.h" using namespace std; automatVara::automatVara(int antal){ antalVaror=antal; } int automatVara::HamtaAntalVaror() { return antalVaror; } void automatVara::saljVara() { antalVaror--; }

automatVara.h

class automatVara { public: automatVara(int); int HamtaAntalVaror (); void saljVara (); private: int antalVaror; };

Permalänk
Medlem
Skrivet av andre12345:

Nu fungerar det som det ska. Men skulle jag kunna baka in

automatVara Japp(5); automatVara Snickers(4); automatVara Twix(3); automatVara Dajm(6);

i typ en funktion? Är det ful kodning att låta det vara där det är? nådde inte ut hämtaantalvaror i menyn när jag hade det liggandes i main, därför flyttade jag upp den.

I regel brukar man försöka undvika globala variabler i C++, eftersom det kan vara svårt att få en översikt över hur de används i mer komplicerade program. Man kan också få en del problem med initialisering och annat. Men i såna här små skoluppgifter kan det bli onödigt komplicerat att undvika globala variabler.

Ett sätt att undvika globala variabler är att helt enkelt skicka runt variablerna till funktionerna de används i. Det enklaste skulle alltså vara att ändra meny till att ta variablerna som argument:

void meny(automatVara &Japp, automatVara &Snickers, automatVara &Twix, automatVara &Dajm) { cout << "Lucka nr 1: Japp. Antal:" << Japp.HamtaAntalVaror() << endl; cout << "Lucka nr 2: Snickers. Antal:" << Snickers.HamtaAntalVaror() << endl; cout << "Lucka nr 3: Twix. Antal:" << Twix.HamtaAntalVaror() << endl; cout << "Lucka nr 4: Dajm. Antal:" << Dajm.HamtaAntalVaror() << endl; cout << "Skriv in numret på varan du vill ha, avsluta med 9" << endl; }

Men den lösningen skalar ju inte särskilt bra, varje gång du vill ändra antalet varor så måste du ändra meny-funktionen. En bättre lösning skulle vara att lagra varorna i en array eller vector och skicka in den istället, t.ex.:

void meny(const std::vector<automatVara> &varor) { for(int i = 0; i < varor.size(); ++i) { cout << "Lucka nr " << i + 1 << varor[i].Namn() << ". Antal:" << varor[i].HamtaAntalVaror() << endl; } cout << "Skriv in numret på varan du vill ha, avsluta med 9" << endl; }

Detta förutsätter att klassen automatVara har en metod Namn som helt enkelt returnerar varans namn. Vectorn kan sedan skapas i t.ex. main:

std::vector<automatVara> varor; varor.push_back(automatVara("Japp", 5)); varor.push_back(automatVara("Snickers", 4)); ...

Beroende på hur långt du kommit med C++ så kan det här vara lite överkurs dock. För en enkel skoluppgift är din lösning helt ok.

Permalänk

Tack för ett bra svar!

Permalänk

hej, har fått en väldigt liknande uppgift i c++. är inte så bra på programmering men hur kopierar jag in detta i visual studios för att starta programmet?