Klasse mit einem Zeiger uebergeben



  • Hallo,

    ich bin C++ - Neuling und studiere Informatik. Nun soll ich eine Turing-Maschine programmieren.

    Wie das Ding funktioniert habe ich verstanden. Ich habe auch ein klares Konzept, wie ich sie erstellen möchte. Aber ich habe das Gefühl, dass ich da bei C++ an eine Grenze stoße, deren Überwindung mir nicht so ganz gelingen will.

    Hier mal nur der wichtigeste Teil des Codes, nämlich die Verbindung der Klassen untereinander. Ich habe den Code mal eben aus dem Kopf zusammengeschrieben. Wenn irgendwo ein Schreibfehler vorliegt bitte ignorieren. Der Code soll nur mein Problem verdeutlichen:

    class tapeStorage()
    {
    // hier kommen nun Attribute und Methoden

    // Konstruktor
    tapeStorage();

    // Destruktor
    ~tapeStorage();
    };

    tapeStorage::tapeStorage(){}
    tapeStorage::~tapeStorage(){}

    class readAndWriteHead()
    {
    // hier kommen nun Attribute und Methoden
    tapeStorage *tape;

    public:

    void writeSomething(string something);

    // Konstruktor
    readAndWriteHead(tapeStorage *tempTape);

    // Destruktor
    ~readAndWriteHead();
    };

    readAndWriteHead::readAndWriteHead(tapeStorage *tempTape)
    {
    tape = tempTape;
    }

    readAndWriteHead::~readAndWriteHead(){}

    void readAndWriteHead::writeSomething(string something)
    {
    cout << "Du bist hier";
    }

    class controller()
    {
    // hier kommen nun Attribute und Methoden
    readAndWriteHead *head;

    public:

    void writeSomething(string something);

    // Konstruktor
    controller(readAndWriteHead *tempHead);

    // Destruktor
    ~controller();
    };

    controller::controller(readAndWriteHead *tempHead)
    {
    head = tempHead;
    }
    controller::~controller(){}

    void controller::writeSomething(string something)
    {
    head->writeSomething(something);
    }

    main()
    {
    string something = "something";

    readAndWriteHead *head = new readAndWriteHead();
    controller *turingMachine = new controller(head);

    turingMachine->writeSomething(something); <-- geht nicht!

    return 0;
    }

    Auf den ersten Blick sieht alles korrekt und logisch aus. Wenn ich aber das Programm starte, und den Head über den Controller anweise, etwas auf das Band zu schreiben, kommt das Programm nicht einmal bis zu der aufgerufenen Methode des Head. Das habe ich mit "cout" schon überprüft. Das merkwürdige ist, dass der Compiler kein bißchen meckert. Dennoch funktioniert der Zugriff auf den Head erst dann, wenn ich ihm den Zugriff auf das Band wegnehmen.

    Warum ist das so? Was mache ich falsch? Ich habe sogar schon versucht, dem Head in der Klasse main() den Zeiger auf die Klasse tapeStorage mitzugeben. Aber das ändert auch nichts. Erst wenn readAndWriteHead() und controller() unter sich sind, kann ich zumindest vom controller() auf die Methoden des readAndWriteHead() zugreifen.

    Mache ich etwas verkehrt oder ist das, was ich hier vorhabe, bei C++ nicht möglich?

    Danke für Input und eventuell einen Tipp, wie ich es dennoch lösen kann...



  • Diabolik schrieb:

    Hallo,

    ich bin C++ - Neuling und studiere Informatik. Nun soll ich eine Turing-Maschine programmieren.

    Wie das Ding funktioniert habe ich verstanden. Ich habe auch ein klares Konzept, wie ich sie erstellen möchte. Aber ich habe das Gefühl, dass ich da bei C++ an eine Grenze stoße, deren Überwindung mir nicht so ganz gelingen will.

    Hier mal nur der wichtigeste Teil des Codes, nämlich die Verbindung der Klassen untereinander. Ich habe den Code mal eben aus dem Kopf zusammengeschrieben. Wenn irgendwo ein Schreibfehler vorliegt bitte ignorieren. Der Code soll nur mein Problem verdeutlichen:

    class tapeStorage()
    {
       // hier kommen nun Attribute und Methoden
       
       // Konstruktor
       tapeStorage();
    
       // Destruktor
       ~tapeStorage();
    };
    
    tapeStorage::tapeStorage(){}
    tapeStorage::~tapeStorage(){}
    
    class readAndWriteHead()
    {
       // hier kommen nun Attribute und Methoden
       tapeStorage *tape;
    
       public: 
    
       void writeSomething(string something);
    
       // Konstruktor
       readAndWriteHead(tapeStorage *tempTape);
    
       // Destruktor
       ~readAndWriteHead();
    };
    
    readAndWriteHead::readAndWriteHead(tapeStorage *tempTape)
    {
      tape = tempTape;
    }
    
    readAndWriteHead::~readAndWriteHead(){}
    
    void readAndWriteHead::writeSomething(string something)
       {
          cout << "Du bist hier";
       }
    
    class controller()
    {
       // hier kommen nun Attribute und Methoden
       readAndWriteHead *head;
    
       public:
    
       void writeSomething(string something);
    
       // Konstruktor
       controller(readAndWriteHead *tempHead);
    
       // Destruktor
       ~controller();
    };
    
    controller::controller(readAndWriteHead *tempHead)
    {
      head = tempHead;
    }
    controller::~controller(){}
    
    void controller::writeSomething(string something)
    {
      head->writeSomething(something);  
    }
    
    main()
    {
       string something = "something";
    
       readAndWriteHead *head = new readAndWriteHead();
       controller *turingMachine = new controller(head);
    
       turingMachine->writeSomething(something); <-- geht nicht!
    
      
       return 0;
    }
    

    Auf den ersten Blick sieht alles korrekt und logisch aus. Wenn ich aber das Programm starte, und den Head über den Controller anweise, etwas auf das Band zu schreiben, kommt das Programm nicht einmal bis zu der aufgerufenen Methode des Head. Das habe ich mit "cout" schon überprüft. Das merkwürdige ist, dass der Compiler kein bißchen meckert. Dennoch funktioniert der Zugriff auf den Head erst dann, wenn ich ihm den Zugriff auf das Band wegnehmen.

    Warum ist das so? Was mache ich falsch? Ich habe sogar schon versucht, dem Head in der Klasse main() den Zeiger auf die Klasse tapeStorage mitzugeben. Aber das ändert auch nichts. Erst wenn readAndWriteHead() und controller() unter sich sind, kann ich zumindest vom controller() auf die Methoden des readAndWriteHead() zugreifen.

    Mache ich etwas verkehrt oder ist das, was ich hier vorhabe, bei C++ nicht möglich?

    Danke für Input und eventuell einen Tipp, wie ich es dennoch lösen kann...

    Bitte die C++ Tags verwenden, sonst kann man nicht viel erkennen.



  • Vermutlich ist irgendwo ein Zeiger ungültig. Da stellt sich ohnehin die Frage: Warum arbeitest du mit Zeigern? Du könntest in C++ auch mit Referenzen arbeiten oder vielleicht brauchst du auch nichts von beiden.

    Anhand deines Codes (der ja nicht echt ist) kann man das Problem so jedenfalls nicht rekonstruieren. Kürz dein Code solange bis der Code kürzer geworden ist, aber der Fehler noch besteht und poste hier Code den man auch testen kann. Alles andere ist nur Raterei.



  • Sorry! War so genervt von meinem Problem, dass ich nicht drüber nachgedacht habe, das ganze mal etwas ordentlicher zu posten.

    Ich bereite das Thema noch mal auf und dann erstelle ich ein neues Thema.

    Danke für's "Kopf waschen!"

    *grins*


Anmelden zum Antworten