Wie bekomme ich ein mehrfaches array aus einer methode in eine klasse übergeben?
-
Moin Leute,
kann mir vlt jemand sagen, wie ich ein mehrfaches array aus einer Methode der übergeordneten klasse zurückgebe?
Funktioniert dies auch mit der Konstruktion?mfg black Sheep
-
Ich habe Probleme mit deiner Begriffswahl:
Mehrfaches Array = Mehrdimensionales Array?
Übergeordnete Klasse einer Methode? Die Klasse selbst oder irgendeine Art von Basisklasse?MfG SideWinder
-
ja sorry
ich meine ein mehrdimensionales array.
und die Methode steckt in der selben klasse
-
class Sample { char** strings; Sample(int sizex, int sizey) : strings(new char*[sizex]) { for(...) strings[i] = new char[sizey]; } ~Sample () { ... } Sample (const Sample&) { ... } Sample& operator= (const Sample& rhs) { ... } // einfach ganz normal zurcükgeben, aber bitte const sonst passieren irgednwann böse dinge const char** getStrings const ( return strings; } };
Viel besser: Das 2D-Array durch einen Container ersetzen.
MfG SideWinder
-
mhn..das problem dabei ist nur, dass das array berreits vorhanden ist.
Es soll durch die Methode nur verändert werden.
Kann man die Adresse des Arrays nicht irgendwie übergeben?EDIT: odervlt kann man dies auch mit der Zugriffsmethode Set_Methode erledigen?
-
Wo genau wurde das 2D-Array erstellt? In der Klasse oder woanders? Im zweiten Fall sieht das so aus:
class Sample { void doSmth ( char ** array ) { // mach was mit array } };
MfG SideWinder
-
es wurde in der selben Klasse wo auch die Methode drinne ist erstellt.
mhn ich werde es so mal ausprobieren danke
-
Dann greif doch einfach ganz normal darauf zu, wo musst du es dann übergeben?! Zeig mal deinen Code, ich verstehs nicht.
MfG SideWinder
-
@Sidewinder: Du meinst sicher
const char* const* getStrings const ( return strings; }
Sonst passieren schlimme Dinge Naja, wer solche Konstrukte verwendet, hat den Schuss in den Fuß auch verdient.
-
Das habe ich versucht..aber irgendwie funktioniert es nicht
//Definiert Ausgabefarben #define BLUE "\033[34;1m" //blaue Textausgabe #define RED "\033[31;1m" //rote Textausgabe #define GREEN "\033[32;1m" //grüne Textausgabe #define BLACK "\033[30;1m" //schwarze Textausgabe #define STANDARD "\033[0;0m" //standard Textausgabe class schiff_spieler { public: char spieler_farbe[2][9]; // Definiert die Spielerfarbe void spieler_farb_auswahl() { int i,farbe; for(i=0;i<2;i++) { cout <<STANDARD << "Spieler "<< i+1 <<" bitte geben Sie Ihre Spielfarbe an" << endl; cout << BLUE << "1.Blau" << endl; cout << RED << "2.Rot" << endl; cout << GREEN << "3.Grün" << endl; cout << BLACK << "4.Schwarz" << endl; do { cin >> farbe; switch(farbe) { case 1: strcpy(spieler_farbe[i],BLUE); break; //ANSI-Escape Farbe Blau case 2: strcpy(spieler_farbe[i],RED); break; //ANSI-Escape Farbe Rot case 3: strcpy(spieler_farbe[i],GREEN); break; //ANSI-Escape Farbe Grün case 4: strcpy(spieler_farbe[i],BLACK); break; //ANSI-Escape Farbe Schwarz default : cout << "Bitte geben Sie eine gültige Farbe an"; break; } }while(farbe > 4 || farbe==0); } cout << spieler_farbe[0] << "Spieler 1" << endl; //Funktioniert cout << spieler_farbe[1] << "Spieler 2" << STANDARD; //Funktioniert } cout << spieler_farbe[0] << "Spieler 1"; //Funktioniert nicht (siehe Compiler-Fehlerausgabe) };
Innerhalb der Methode funktioniert alles...aber nachdem die Methode beendet wird kommt folgender Fehler:
schiffe_blub.cpp:55: error: ISO C++ forbids declaration of ‘cout’ with no type schiffe_blub.cpp:55: error: expected ‘;’ before ‘<<’ token
aus diesem Grunde dachte ich, dass man das Array trotz Klasse zurückgeben muss
-
Okay ich könnt mich selber in den Hintern beißen...-.-
Habe die Ausgabe ja einfach so ohne Methode in die Klasse geschrieben...
Tut mir Leid beim nächsten mal gug ich erstmal genauermfg black Sheep007
-
(1) Verwende keine #define-Konstanten (Makros) sondern String-Literale
(2) Verwende doch statt char[2][9] besser std::string[2] oder noch besser:enum Color { BLUE , RED , GREEN , BLACK , STANDARD }; static const char* COLORS = { "\033[34;1m", ... }; struct Player { string color; ... // weitere sachen die ein spieler hat }; class Game { Player players [2]; void choose_colors () { ... players[0] = COLORS[i]; ... } }; (3) Das eigetnliche Problem ist, dass du eine Ausgabe außerhalb irgendeiner Funktion machst. Das sollst du nicht hier machen sondern im Hauptprogramm: [cpp] int main () { schiff_spieler game; game.spieler_farb_auswahl(); cout << game.spieler_farbe[0] << "Spieler 1"; // Hier gehts }
MfG SideWinder
-
Man kann auch einfach op<< für Color überladen und strings völlig vergessen:
enum Color { BLUE , RED , GREEN , BLACK , STANDARD }; std::ostream& operator<<(std::ostream& s, Color c) { static const char* const COLORS[] = { "\033[34;1m", ... }; return s << COLORS[c]; }
und arbeitet sonst überhaupt nur mit Color und gewinnt noch etwas Typsicherheit hinzu.
-
Glaubst du nicht, dass das noch etwas zu kompliziert für unseren Probanden ist?
Edit: Außerdem wurde mir zB verboten das für die IC zu implementieren. Da hieß es was von "dafür nicht gemacht"
MfG SideWinder
-
SideWinder schrieb:
Glaubst du nicht, dass das noch etwas zu kompliziert für unseren Probanden ist?
Persönlich finde ich das weniger kompliziert. Schließlich ist diese ganze Stringgeschichte ja sowieso nur eine Frage der Ausgabe. Aber soll sowieso nur ein Anstoß sein.
Edit: Außerdem wurde mir zB verboten das für die IC zu implementieren. Da hieß es was von "dafür nicht gemacht"
Ich kann nicht folgen.