Globale Variable
-
void Anfang() { int x = 5; int y = Weiter(x); // y == ++xyz } int Weiter(int input) { return NochWeiter(input); } int NochWeiter(int xyz) { ++xyz; cout << "Value: " << xyz << endl; return xyz; }du musst die funktionen einfach was zurückgeben lassen
-
Danke nochmals für die Antworten, aber was wenn ich mehrere Variablen habe?
-
Dann ist möglicherweise dein Design nicht gut. Wenn viele Funktionen mit denselben Variablen arbeiten, sollte man über eine Klasse nachdenken.
Ansonsten geht auch sowas:
struct myStruct { std::string stringVar; int intVar; int intVar2; } void MachWas(myStruct& ms) { ms.stringVar = "changed"; }
-
Flutschii schrieb:
Danke nochmals für die Antworten, aber was wenn ich mehrere Variablen habe?
Beispiel?
-
Vielen Dank, mit der return würde es so wie ich das Projekt habe funktionieren, aber ich denke das ich das eben immer weiter entwickle und dann plötzlich 2 Variablen habe, darum frage ich jetzt schon was währe wenn

geht dasselbe auch mit einem Array? z.b. Array "NochvielWeiter[10][10]"?
dann einfach im code
int NochvielWeiter[10][10] = Weiter(vielWeiter[10][10])?
-
nein, mit Arrays geht das so nicht. Es geht, aber anders. (Präventiv:) Du solltest statt Arrays sowieso lieber std::vector nehmen.
Generell kommst du gerade irgendwie vom Hundersten ins Tausendste. Es gibt häufig mehrere Möglichkeiten der Modellierung. Je nach konkretem Problem sind einige besser, andere schlechter. Allgemein lässt sich sowas selten sagen.
-
daddy_felix schrieb:
nein, mit Arrays geht das so nicht. Es geht, aber anders. (Präventiv:) Du solltest statt Arrays sowieso lieber std::vector nehmen.
Generell kommst du gerade irgendwie vom Hundersten ins Tausendste. Es gibt häufig mehrere Möglichkeiten der Modellierung. Je nach konkretem Problem sind einige besser, andere schlechter. Allgemein lässt sich sowas selten sagen.
jo ich merke schon das ich grad bisschen überfordert werde mit dem Schritt, aber irgendwie will ich einfach eine schöne lösung für mein Problem finden aber find sie einfach nicht..
Globale Variablen will ich nicht..
Arrays hab ich keine Ahnung..
-
Was ist denn dein Problem? Werde doch mal ein bisschen konkreter...
std::vector kannst du wie einen einfachen Datentyp als Parameter über- bzw. zurückgeben.
std::vector machWas(int x) { std::vector myVector; myVector.push_back(x); MachNochMehr(myVector); return myVector; } void MachNochMehr(std::vector& vec) { vec.push_back(5); vec.push_back(vec.size()); }}
-
Eine gute Lösung? Dann Post mal dein konkretes Problem dann können wir dir sicher eine gute Lösung anbieten.
gruß
syntax
-
Flutschii schrieb:
Vielen Dank, mit der return würde es so wie ich das Projekt habe funktionieren, aber ich denke das ich das eben immer weiter entwickle und dann plötzlich 2 Variablen habe, darum frage ich jetzt schon was währe wenn

In der Regel sind Werte, die aus der selben Funktion stammen, nicht unabhängig voneinander, sondern Teil der gleichen Abstraktion. Es ist also zu erwarten, dass sie von vornherein durch eine entsprechende Klasse oder ggf. einen Container abgebildet werden können. Aus vielen Werten wird dann automatisch wieder nur einer.
In den eher seltenen Fällen (primär bestimmte Arten von generischem Code), wo tatsächlich nur Mengen von Werten ohne inneren Zusammenhang entstehen, gibt es Möglichkeiten, diese temporär in Tupeln zusammenzufassen (std::tie).
-
Also es ist so:
Ich habe ein ganz einfaches Spielchen hier, wobei ich eine Map in einer Datei habe und diese aus 1en und 0en besteht, und ich diese Datei nun in die Variable dieMap[100][100] lade in der Funktion LoadMap. Nun brauch ich aber diese Variable auch wenn ich mit dem Spieler rumlaufe, da ich ja kollision abfragen muss, und darum muss ich von der Funktion MovePlayer, wo aber in der Datei Player.cpp ist, auf die Variable dieMap, die in Map.cpp drin ist, zugreifen können..
Klar könnte ich das jetzt mit return machen, aber ich denke das später nochmals eine funktion kommmt die dann diese Variable will und dann steh ich wieder vor demselben Problem...
ich möchte ungern dieMap global definieren, aber wie mache ich das gewisse Funktionen aus anderen Dateien zugriff auf diese erlangen ohne global?
-
Wie wärs mit ner Singleton-Klasse?
könnte so aussehen:
// CMap.h class CMap { private: CMap(); // Wichtig: Konstruktor ist private! public: int arr[100][100]; // Die Map // Beispielfunktionen: void LoadMap(); // Laden einer Map static CMap& Instance() { static CMap m; return m; } }; // Implementierung von LoadMap in CMap.cpp // Zugriff dann so: CMap::Instance().LoadMap(); CMap::Instance().arr[0][0] = 1; // oder so: CMap& myMap = CMap::Instance(); //Referenz! myMap.LoadMap(); int i = myMap.arr[1][2];So kannst du dann in allen Funktionen auf die gleiche Map zugreifen, die du einmal geladen hast, da es von der Klasse CMap nur eine Instanz gibt ,die die Klasse selber besitzt.
Also ich find das schön...
-
Jochen S. schrieb:
CMap(); // Wichtig: Konstruktor ist private!Das sollte allerdings der Copy-ctor sein...

-
camper schrieb:
Jochen S. schrieb:
CMap(); // Wichtig: Konstruktor ist private!Das sollte allerdings der Copy-ctor sein...

Jaja, hast ja recht. Den Zuweisungsoperator müsste man auch noch private machen, den Destruktor eigentlich auch

-
Oha, bin grad nich zuhause aber werd mir das dann mal anschauen, vielen dank auf jedenfall schonmal!
-
Jetzt krieg ich einen Fehler...
error LNK2001: Nicht aufgelöstes externes Symbol ""private: __thiscall SMap::SMap(void)" (??0SMap@@AAE@XZ)".bei
SMap::Instance().LoadMap("map.txt");
-
Tausche gerne ein '
S' gegen ein 'C'.
-
Spielt das ein Rolle ob ich da ein S oder ein C hab? ich hab überall S gegen C getauscht....
-
Ne, hab nur geglaubt, du hättest Jochen S.'s Beispiel übernommen (
CMap).
Spendier dem Konstruktor eine Definition.
-
I did...
Singleton.hpp
class SMap { private: SMap(); public: int mapFile[100][100]; void LoadMap(const char *filename); static SMap &Instance() { static SMap m; return m; } };Singleton.cpp
#include "stdafx.h" #include "SingletonMap.hpp" #include <fstream> void SMap::LoadMap(const char *filename) { int mapSizeX, mapSizeY, loadX, loadY; std::ifstream openfile(filename); if(openfile.is_open()) { openfile >> mapSizeX >> mapSizeY; while(!openfile.eof()) { openfile >> mapFile[loadX][loadY]; loadX++; if(loadX >= mapSizeX) { loadX = 0; loadY++; } } } } int mapFile[100][100];Map.cpp
void Map::DrawMap(sf::RenderWindow *mainWindow) { SMap::Instance().LoadMap("map.txt"); // }