Funktion: Zweidimensionales Array zurückgeben
-
Hallo liebe C++ Community,
ich bin dabei C++ zu lernen und habe mir gedacht, ich spiele ein bisschen mit einer Klasse herum. Jetzt erstmal der Code für die Klasse

class CRocket { private: int iPosTargetX, iPosTargetY; double dSpeed; double dDamage; double dRemoval; double dTimeToElim; unsigned int uiIdNumber; std::string sType; double CalculateTimeToElim() { return (this->dRemoval/this->dSpeed); } public: CRocket(int iPosTargetX, int iPosTargetY, double dRemoval, unsigned int uiIdNumber) { this->iPosTargetX = iPosTargetX; this->iPosTargetY = iPosTargetY; this->dSpeed = 8600; this->dDamage = 999999; this->dRemoval = dRemoval; this->dTimeToElim = CalculateTimeToElim(); this->uiIdNumber = uiIdNumber; this->sType = "AVR X8600T"; } CRocket(int iPosTargetX, int iPosTargetY, double dRemoval, unsigned int uiIdNumber, std::string sType) { this->iPosTargetX = iPosTargetX; this->iPosTargetY = iPosTargetY; this->dSpeed = 8600; this->dDamage = 999999; this->dRemoval = dRemoval; this->dTimeToElim = CalculateTimeToElim(); this->uiIdNumber = uiIdNumber; this->sType = sType; } ~CRocket() { } void StartRocket(int iPosX, int iPosY) { } };So. In der main()-Funktion schreibe ich mir jetzt ein Zweidimensionales Feld ( 9x9 ):
(x) 1 2 3 4 5 6 7 8 9 ------------------ x x x x x x x x x | 1 x x x x x x x x x | 2 x x x x x x x x x | 3 x x x x x x x x x | 4 x x x x x x x x x | 5 (y) x x x x x x x x x | 6 x x x x x x x x x | 7 x x x x x x x x x | 8 x x x x x x x x x | 9Um die "Rakete" in die Position des Feldes "fliegen" zu lassen, habe ich mir gedacht, ich baue eine Funktion (StartRocket()), die ein Zweidimensionales Array zurückgibt. Geht das überhaupt? Wenn ja, ist es verständlich für einen Anfänger wie mich, oder sollte ich es lieber erstmal manuell machen?
Ich danke für die Aufmerksamkeit :p
MFG
-
guck dir mal std::vector an, damit sollte es gehen.
-
Vom objektorientierten Ansatz her wäre es schöner kein 2 dimensionales Array mit den Koordinaten zurückzugeben sondern eine neue Datenstruktur. z.B. "Punkt"
class Punkt { public: int x; int y; }StartRocket würde dann z.B. so aussehen
Punkt StartRocket(int iPosX, int iPosY) { Punkt p; p.x = iPoxX; p.y = iPoxY; return p; }Es bleibt dir überlassen z.B. für die Klasse Punkt noch einen Konstruktor zu bauen, so dass du die Member eleganter initialisieren kannst. Der nächste Schritt wäre dann, für die Member Get und Set Methoden zu machen. IMHO bei so einfachen Klassen, die nur zur Datenhaltung da sind, aber Overkill.
-
Morle, wieso überhaupt
class? Hier bietet sich dochstructan. Dann kannst du dir daspublicsparen, und es wird auch klarer, dass hier nur Datenhaltung praktiziert wird, und keine Funktionalität.
-
Okay, danke Jungs.
struct STarget { int PosX; int PosY; }; class CRocket { private: int iPosTargetX, iPosTargetY; double dSpeed; double dDamage; double dRemoval; double dTimeToElim; unsigned int uiIdNumber; std::string sType; double CalculateTimeToElim() { return (this->dRemoval/this->dSpeed); } public: CRocket(int iPosTargetX, int iPosTargetY, double dRemoval, unsigned int uiIdNumber) { this->iPosTargetX = iPosTargetX; this->iPosTargetY = iPosTargetY; this->dSpeed = 8600; this->dDamage = 999999; this->dRemoval = dRemoval; this->dTimeToElim = CalculateTimeToElim(); this->uiIdNumber = uiIdNumber; this->sType = "AVR X8600T"; } CRocket(int iPosTargetX, int iPosTargetY, double dRemoval, unsigned int uiIdNumber, std::string sType) { this->iPosTargetX = iPosTargetX; this->iPosTargetY = iPosTargetY; this->dSpeed = 8600; this->dDamage = 999999; this->dRemoval = dRemoval; this->dTimeToElim = CalculateTimeToElim(); this->uiIdNumber = uiIdNumber; this->sType = sType; } ~CRocket() { } double GetTimeToElim() { return this->dTimeToElim; } int GetPosX() { return this->iPosTargetX; } int GetPosY() { return this->iPosTargetY; } STarget StartRocket(int iPosX, int iPosY) { STarget T1; T1.PosX = iPosX; T1.PosY = iPosY; return T1; } };Koordinaten werden gespeichert und Ziel zerstört :D.
Aber eine letzte Frage bleibt mir für die Zukunft: Wie kann ich nun ein 2D-Array zurückgeben?
-
deklarier doch mal dein 2d array
-
_matze schrieb:
Morle, wieso überhaupt
class? Hier bietet sich dochstructan. Dann kannst du dir daspublicsparen, und es wird auch klarer, dass hier nur Datenhaltung praktiziert wird, und keine Funktionalität.Geschmackssache und Vorraussicht. Ich sagte ja, normalerweise würde *ich* wenigstens noch einen Konstruktor der Art "Punkt(int x, int y)" implementieren. Natürlich geht das auch bei structs, aber structs mit Funktionen sind IMHO schlechter Stil.
-
Das ist glaube ich nicht so einfach. Arrays zurückszugeben oder als Parameter zu übergeben ist keine so gute Idee. Verwende besser std::vector, dann ist das übergeben und zurückgeben einfacher

-
wedfgbh schrieb:
deklarier doch mal dein 2d array
char acField[9][9];Und jetzt?

-
klucki9 schrieb:
wedfgbh schrieb:
deklarier doch mal dein 2d array
char acField[9][9];Und jetzt?

Wenn du dein Array nur so auf dem Stack anlegst, macht es keinen Sinn es zurück zu geben, weil es wieder freigegeben wird, sobald die Funktion verlassen wird. Du könntest ein char** Array mit new anlegen und das zurück geben, aber std::vector ist viel einfacher zu verwenden. Außerdem kann man ein 2D Array auch immer als 1D Array darstellen.
-
Okay danke
Thema erledigt.