Char Array an Konstruktor übergeben



  • Hi!
    Seit mittlerweile 5 Stunden verzweifle ich an unserer Informatik Hausübung und ich habe nach wie vor keine Lösung für mein/unser Problem gefunden.

    Aufgabenstellung:
    Wir müssen eine Klasse "Level" schreiben, die ein paar Membervariablen enthalten soll; also Levelname (string), Spielsymbol (char), Kurzname vom Level (char[2]), usw. Wir sollen nun einen Konstruktor schreiben, dem die Attribute übergeben werden. Unser einziges und schlimmstes Problem ist der Kurzname (char[2]).

    In der Level.h habe ich (Kurzfassung):

    class Level
    {
    private:
      std::string cl_name;
      char cl_kurz_name[2];
    public:
      Level(std::string cl_name, char *cl_kurz_name);
    };
    

    ... und in der Level.cpp (ebenfalls nur kurzer Auszug):

    Level::Level(std::string cl_name, char *cl_kurz_name)
    {
      [code];
    }
    

    Unser Programm wird mit folgendem Ausdruck getestet (Klassenaufruf):

    //Level Level_1(..., [cl_name], [cl_kurzname], ...);
    Level Level_1(..., "Level_1", "L1", ...);
    

    Das Problem ist nun, dass ich vom Compiler mit Fehlermeldungen überhäuft werde, sobald das char array verwendet wird.

    In verschiedenen Foren habe ich nun gelesen, dass man ein char array gar nicht mit einem Konstruktor bearbeiten kann, sondern dass das nur mit dem Standardkonstruktor funktioniert (kann aber nicht sein, da wir den Standardkonstruktur NICHT verwenden dürfen). In anderen Foren habe ich gelesen, dass man das char array im Konstruktor manuell füllen könnte; das würde aber nur funktionieren, wenn man 'L1' statt "L1" eingibt (also einfache Striche, keine Anführungszeichen). Diese Möglichkeit fällt für mich aber ebenfalls weg, weil das Programm wie gesagt mit dem oben genannten Ausdruck getestet wird.

    Hat vielleicht irgendjemand hier eine Idee für dieses Problem?

    mfg



  • Du hast da ne Menge von Problemen.
    "L1" ist 3 Zeichen groß (und zwar Z, 1 und danach \0 als Nullterminierung). cl_kurz_name hat aber nur Platz für 2.
    "L1" hat den typ const char*. Der Konstruktor nimmt aber nur char*.
    Das sind mal zwei Fehler die ich schon bei diesem Zusammengeschnittenen code sehe. Wo deine Compilerfehler tatsächlich herkommen, beachte mal das hier.



  • Keine Ahnung wer sich solche Übungen einfallen lässt... 😞
    Das wichtigste wäre IMHO, dass Du das, was Du in anderen Foren gelesen zu haben glaubst, vergisst oder nochmal nachliest. Denn das was Du verstanden hast ist ziemlich wirr.

    Bevor Du mit strncpy() und Konsorten kommst, hier eine Lösung, die die beiden Zeichen einzeln zuweist und dabei ganz gut mit zu langen, zu kurzen und gar nicht vorhandenen strings zurechtkommt.

    #include <iostream>
    #include <string>
    
    struct level{
      char kurz_name[2];
      level(const char* kn) {
        kurz_name[0] = kn ? kn[0] : '\0';
        kurz_name[1] = kn && kn[0] != '\0' ? kn[1] : '\0';
      }
      std::string to_string() const {
        return kurz_name[1] ? std::string(kurz_name, kurz_name+2)
          : kurz_name[0] ? std::string(kurz_name, kurz_name+1)
          : std::string();
      }
    };
    
    std::ostream& operator<<(std::ostream& out, const level& l){
      return out << l.to_string();
    }
    
    int main(){
      level levels[] = { nullptr, "Furble Wurble", " reitet", "auf"+1, "Asphalt bei"+6, "Utopi", "a!" };
      for(auto l : levels)
        std::cout << l;
      std::cout << '\n';
    }
    

Log in to reply