Memberfunktion von KlasseA in KlasseB verwenden



  • Hallo, ich bins schon wieder.

    Ich bin gerade dabei einen recht komplexen Code zu modifizieren, und versuche diesen Code erstmal durch einfache Codeschnipsel zu verstehen. Da ich mich aber noch immer noch als Anfaenger bezeichnen muss, bekomme ich immer wieder Probleme.

    Folgenden Code habe ich mir zusammengetippt:

    #include <fstream>
    #include <iostream>
    
    using namespace std;
    
    struct myClass1 {
      ofstream *outfile;
      double x1, x2, xout;
      double yout[6];
    
      myClass1(ofstream *file) : outfile(file) {}
    
      void save(double x) {
      }
    };
    
    struct myClass2 {
      myClass1 out;
    
      myClass2(myClass1 Obj) : out(Obj) {}
    
      out.save(15.0);
    };
    
    int main(int argc, char **argv)
    {
      ofstream outfile("out.res");
      return 0;
    }
    

    Der Compiler meckert aber folgendes:

    test_class.cc:22: error: ISO C++ forbids declaration of 'out' with no type
    test_class.cc:22: error: expected ';' before '.' token
    

    Ich verstehe nicht, warum er 'out' nicht kennt 😡

    Vielen Dank,
    HarryKane



  • wieso struct, wenn du Klassen willst? out.save muss dann schon in ne Methode



  • Also das mit dem struct ist halt weil das so vom OrginalCode kommt. struct ist ja nix anderes als class, nur dass es von vorn herein public ist.

    out.save muss dann schon in ne Methode

    Sorry, manchmal (nein, was C++ angeht eher haeufiger) bin ich etwas schwer von Begriff. Kannst du das bitte fuer mich idiotensicher erklaeren?



  • harrykane schrieb:

    ...

    1. Von Datenkapselung schon was gehört?
    2. Willst du hier wirklich eine KOPIE übergeben: (Dann bitte nicht Kopierkonstruktor... vergessen)

    struct myClass2
    {
      myClass1 out;
      myClass2(myClass1 Obj) // Kopie1
      : out(Obj)             // Kopie2
      {}
    };
    

    Wenn die Übergabe notwendig ist, und es das gleiche Objekt bleiben soll würde ich mit einer Referenz arbeiten. Oder zumindest würde ich den Parameter des Konstruktor in eine const Reference umwandeln um zumindestens nur eine Kopie anzulegen.

    Zu den Rest gibt es schon Kommentare, davon abgesehen kräuseln sich meine Fußnägel von dem Code...

    cu André



  • Du kannst in Klassen nicht einfach so nen Aufrufbefehl reinschreiben. Was du da geschrieben hast ist wie:

    class foo{
      std::cout<<"Hallo";
    }
    

    In einer Klasse (oder struct, ist ja egal) musst du das halt alles in Methoden (Also Klassenfunktionen) reinschreiben. Einfach so macht es ja auch keinen Sinn, wie sollte man es denn aufrufen?

    EDIT: Too late.



  • harrykane schrieb:

    out.save muss dann schon in ne Methode

    Sorry, manchmal (nein, was C++ angeht eher haeufiger) bin ich etwas schwer von Begriff. Kannst du das bitte fuer mich idiotensicher erklaeren?

    Wann willst du Save aufrufen? Mit sicherheit wenn irgendwas ausgeführt wird. Und wie führt man etwas aus? In dem man eine Funktion/Methode aufruft. Ein Aufruf kann aber niemals alleine stehen, sondern muss selbst in einer Funktion/Methode enthalten sein.

    z.B.:

    struct myClass2 {
      //...
    
      void Save()
      {
        out.save(15.0);
      }
    };
    


  • harrykane schrieb:

    out.save muss dann schon in ne Methode

    Sorry, manchmal (nein, was C++ angeht eher haeufiger) bin ich etwas schwer von Begriff. Kannst du das bitte fuer mich idiotensicher erklaeren?

    also folgendes:

    out.save(15.0);
    

    ist ein Funktionsaufruf.
    Der muss in einem Block stehen, wo Funktionsaufrufe auch getätigt werden dürfen - sprich er muss irgendwo im "Programm" bzw in der Eintrittsfunktion oder einer anderen Funktion (die irgendwo aufgerufen wird) stehen.
    Momentan steht er inmitten deiner Klassendeklaration(-definition), die ja nur festlegt, welche Member deine 2 Klassen haben.



  • Wann willst du Save aufrufen? Mit sicherheit wenn irgendwas ausgeführt wird. Und wie führt man etwas aus? In dem man eine Funktion/Methode aufruft. Ein Aufruf kann aber niemals alleine stehen, sondern muss selbst in einer Funktion/Methode enthalten sein.

    [...]ist ein Funktionsaufruf.
    Der muss in einem Block stehen, wo Funktionsaufrufe auch getätigt werden dürfen - sprich er muss irgendwo im "Programm" bzw in der Eintrittsfunktion oder einer anderen Funktion (die irgendwo aufgerufen wird) stehen.
    Momentan steht er inmitten deiner Klassendeklaration(-definition), die ja nur festlegt, welche Member deine 2 Klassen haben.

    Jetzt hab ichs kapiert. Manchmal bin ich so ein Trottel, da hab ich beim Vereinfachen wohl etwas zu sehr vereinfacht 🙄

    1. Von Datenkapselung schon was gehört?
    2. Willst du hier wirklich eine KOPIE übergeben: (Dann bitte nicht Kopierkonstruktor... vergessen)

    1. Ja, entfernt 😃
    Scherz beiseite, der Code stammt nun mal nicht von mir, ich versuche nur zu verstehen was die Schreiberlinge gemacht haben.
    2. Weiss ich noch nicht. Letztendlich wohl eher nicht.


Log in to reply