webForumDet fria alternativet

En förändring i ingredienslistan -> alla pizzor uppdaters

C/C++

16 svar · 700 visningar · startad av jme

Medlem sedan maj 20012 237 inlägg
Frågan#1

Hej.

Håller på med en skoluppgift. Nej, vill inte ha allt löst. ;)
Ska göra ett konsoll-program som man ska kunna skapa en pizza-meny samt alla olika ingredienser.

Man skapar en ny pizza genom att ange vilka ingredienser som ingår.
Jag tänkte att jag skulle skapa en lista med alla ingredienser.

Jag har klasserna: pizza, ingrediens

Låt oss säga att jag har följande pizzor:

a) skinka, paprika
b) lök, räka, ananas
c) paprika, lök

När man skapar pizzorna a, b och c så skapar man inte en ny inbrediens-objekt, utan man använder ett ur listan.

Jag vill alltså få den funktionaliteten att ifall jag ändrar paprika till röd paprika så syns förändringen i alla pizzor.

Jag behöver inte ha en komplett lösning utan jag vill bara veta hur jag skall lagra alla ingredienser, så att förändringarna kan uppdateras.

Medlem sedan feb. 20002 300 inlägg
#2

jme skrev:

Hej.

Håller på med en skoluppgift. Nej, vill inte ha allt löst. ;)
Ska göra ett konsoll-program som man ska kunna skapa en pizza-meny samt alla olika ingredienser.

Man skapar en ny pizza genom att ange vilka ingredienser som ingår.
Jag tänkte att jag skulle skapa en lista med alla ingredienser.

Jag har klasserna: pizza, ingrediens

Låt oss säga att jag har följande pizzor:

a) skinka, paprika
b) lök, räka, ananas
c) paprika, lök

När man skapar pizzorna a, b och c så skapar man inte en ny inbrediens-objekt, utan man använder ett ur listan.

Jag vill alltså få den funktionaliteten att ifall jag ändrar paprika till röd paprika så syns förändringen i alla pizzor.

Jag behöver inte ha en komplett lösning utan jag vill bara veta hur jag skall lagra alla ingredienser, så att förändringarna kan uppdateras.

Lagra en pizzas ingredienser som referenser till listan med ingrediensobjekt.

[Ingredienser] {Ost, Tomat, Svamp, Skinka}

[Vesuvio] {lista med referenser till Ost, Tomat och Skinka i Ingredienslistan}

Medlem sedan maj 20012 237 inlägg
#3

Äh, jag testade bara med pekare och det verkade inte fungera. Har inte så stor koll på detta med referenser och pekare. ;)

Ska testa nu!

Medlem sedan maj 20012 237 inlägg
#4

Jag testar dessa referense just nu med string-objekt, utan resultat.

Grejen med referenser är väl den att om man skapar en referense till ett objekt så kan man uppdatera objektet genom referensen och tvärtom? Dvs om man uppdaterar objektet direkt så syns förändringen även om man använder referensen?

Iofs så kör jag just nu med maps...

Jag har följande kod:

	map <string, string> names;

	string key = "name";
	string value = string("jme");

	string &ref = value;
	
	names.insert(make_pair(key, value) );

	map<string, string>::iterator it = names.find(key);

	ref = "ukko";

	if(it != names.end() )
	{
		cout << "Found it!" << endl;
		cout << it->first << endl;
		cout << it->second << endl;
		it->second = "pakko";
	}
	else
	{
		cout << "Could not find it!" << endl;
	}

	cout << value << endl; // jag vill at det ska vara "pakko" !
Medlem sedan feb. 20002 300 inlägg
#5

jme skrev:

Jag testar dessa referense just nu med string-objekt, utan resultat.

Grejen med referenser är väl den att om man skapar en referense till ett objekt så kan man uppdatera objektet genom referensen och tvärtom? Dvs om man uppdaterar objektet direkt så syns förändringen även om man använder referensen?

Iofs så kör jag just nu med maps...

Jag har följande kod:

	map <string, string> names;

	string key = "name";
	string value = string("jme");

	string &ref = value;
	
	names.insert(make_pair(key, value) );

	map<string, string>::iterator it = names.find(key);

	ref = "ukko";

	if(it != names.end() )
	{
		cout << "Found it!" << endl;
		cout << it->first << endl;
		cout << it->second << endl;
		it->second = "pakko";
	}
	else
	{
		cout << "Could not find it!" << endl;
	}

	cout << value << endl; // jag vill at det ska vara "pakko" !

Ett pair som du skapar med make_pair kommer att köra copy-constructors på strängarna för att forma en pair-struct. Därmed kommer alltså inte värdet i din map att förändras bara för att du har en referens till value. :)

Medlem sedan dec. 20025 483 inlägg
#6

Använd pekare:

 map <string, string*> names;

    string key = "name";
    string value = string("jme");

    string &ref = value;
    
    names.insert(make_pair(key, &value) );

    map<string, string*>::iterator it = names.find(key);

    ref = "ukko";

    if(it != names.end() )
    {
        cout << "Found it!" << endl;
        cout << it->first << endl;
        cout << *(it->second) << endl;
        *(it->second) = "pakko";
    }
    else
    {
        cout << "Could not find it!" << endl;
    }

    cout << value << endl; // jag vill at det ska vara "pakko" !

jme skrev:

Jag vill alltså få den funktionaliteten att ifall jag ändrar paprika till röd paprika så syns förändringen i alla pizzor.

Då kan du använda statiska medlemmar. En sådan delas mellan samtliga instansieringar av klassen:

class c
{
 private:
  static std::string s;
 public:
  static void setS(const std::string& str){ s = str; }
  std::string getS(){ return s; }
};

std::string c::s = "default";

int main()
{
 c a,b;
 std::cout << a.getS() <<  ' ' << b.getS() << std::endl;

 c::setS("röd");
 std::cout << a.getS() <<  ' ' << b.getS() << std::endl;
}
Medlem sedan maj 20012 237 inlägg
#7

Nu ska jag göra mat men senare skall jag kika på era förslag, tack!

Medlem sedan maj 20012 237 inlägg
#8

Nu får jag:

Harjoitus error LNK2020: unresolved token (0A000041) ?ingredients@IngredientMenu@@0V?$list@VIngredient@@V?$allocator@VIngredient@@@std@@@std@@A
Harjoitus fatal error LNK1120: 1 unresolved externals

Kanske har jag missat nåt...ska kika...

Medlem sedan maj 20012 237 inlägg
#9

dubbelpost:

Medlem sedan maj 20012 237 inlägg
#10

Har följande klass-metod:

ingredients är: list <Ingredient> ingredients;
stuff fungerar helt bra men tar jag bort kommentaren från raden ovan så blir det fel:

Harjoitus fatal error LNK1120: 1 unresolved externals
Harjoitus error LNK2020: unresolved token (0A00001A) ?ingredients@IngredientMenu@@0V?$list@VIngredient@@V?$allocator@VIngredient@@@std@@@std@@A

void IngredientMenu::removeIngredients()
{
	//ingredients.clear();
	list <Ingredient> stuff;
}

ingredients är statisk och det är metoden också.

Medlem sedan maj 20012 237 inlägg
#11

Hmm, skapade ännu en statisk klassvariabel, value och får samma fel.

Hur ska man skapa statiska, privata klassvariablar och en getXX() metod till dem?

Jag kör med int IngredientMenu::getValue() {return value; }

Just ja, man ska tydligen köra med IngredientMenu::ingredients.clear();

Inte för att det ännu skulle fungera.

Hur initieras en statisk klassvariabel och var?

Medlem sedan feb. 20002 300 inlägg
#12

jme skrev:

Hmm, skapade ännu en statisk klassvariabel, value och får samma fel.

Hur ska man skapa statiska, privata klassvariablar och en getXX() metod till dem?

Jag kör med int IngredientMenu::getValue() {return value; }

Just ja, man ska tydligen köra med IngredientMenu::ingredients.clear();

Inte för att det ännu skulle fungera.

Hur initieras en statisk klassvariabel och var?

class Foo
{
      public:
           static int GetValue() { return m_value; }

      private:
           static int m_value;
};

Initieringen gör du någonstans utanför klassdeklarationen om jag inte minns fel. Var ett tag sedan jag pillade C++.

int Foo::m_value = 0;
Medlem sedan maj 20012 237 inlägg
#13

Jag har deklarationerna för metoderna i en separat fil, "IngredientMenu.h".

Medlem sedan maj 20012 237 inlägg
#14

hmm, gjord nu en helt ny projekt och nu fick jag en statisk variabel och metod att fungera. Får väl jämföra dessa två projekt och se vart det gick åt skogen... :)

Medlem sedan maj 20012 237 inlägg
#15

Äh, ser ju inget fel med koden... :|

Medlem sedan maj 20012 237 inlägg
#16

Tog bort allt onödigt:

"IngredientMenu.h"

class IngredientMenu
{
private:
	static int value;
public:
	IngredientMenu();

	static int getValue();
};

"IngredientMenu.cpp"

#include "IngredientMenu.h"

IngredientMenu::IngredientMenu() // default constructor
{
	value = 100;

}

int IngredientMenu::getValue()
{
	return value;
}

Detta ger mig:

Harjoitus fatal error LNK1120: 1 unresolved externals
Harjoitus error LNK2020: unresolved token (0A00001A) ?value@IngredientMenu@@0HA

Medlem sedan maj 20012 237 inlägg
#17

hmm, jahapp...det var visst int IngredientMenu::value = 0; som saknades

256 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)