Vektor objektorientiert an eine Funktion übergeben mit call by reference



  • Hallo

    Ich verstehe nicht genau wie man einen Vektor via "call by reference" an eine Funktion übergibt.

    Ich habe hier eine Klasse Routine:

    Routine.h

    #ifndef ROUTINE_H
    #define ROUTINE_H
    
    #include <vector>
    #include <cstdlib>
    
    // Class for routines and algorithms
    class Routine {
      public:
       Routine(); // Constructor 
    
       // Fisher-Yates shuffle algorithm 
       void FisherYates(std::vector<int> &vec);
    
    };
    
    #endif  // ROUTINE_H
    

    Routine.cpp

    #include "./Routine.h"
    
    // _____________________________________________________________________
    // Constructor for the Routine class.
    Routine::Routine() {
    
    }
    // _____________________________________________________________________
    void Routine::FisherYates(std::vector<int> &vec) {
     int n = vec.size();
      for(int i=n-1; i>0; --i) {
      std::swap(vec[i], vec[rand() % (i+1)]);
      } 
    }
    

    In meiner Main.cpp steht nun:

    vector<int> activity = {0,1,2,3,4};
    Routine::FisherYates(activity);
    

    Dies führt zu dem Fehler:

    error: cannot call member function ‘void Routine::FisherYates(std::vector<int>&)’ without object
     Routine::FisherYates(activity);
                                  ^
    

    Was bedeutet dieser Fehler. Was mache ich falsch? In meinem Buch steht, dass ich mit call by reference bei der Funktion ein & für die Adresse angeben muss und beim Aufruf dann kein & benötige.

    Danke für die Hilfe und Grüße



  • Warum ist die Funktion Member einer Klasse? Offensichtlich arbeitet sie nur mit dem übergebenen Vector.

    Eine Memberfunktion braucht halt ihr Objekt. Das hat überhaupt nichts mit dem Vector zu tun.



  • Hallo

    Die Methode soll doch Member der Klasse Routine sein. Ich verstehe nicht genau was du meinst manni66

    Gruß



  • cpp_Jungspund schrieb:

    Die Methode soll doch Member der Klasse Routine sein

    Warum? Weil es objektorientiert ist, wenn man class um seine Funktionen schreibt?
    Der Kommentar
    // Class for routines and algorithms
    deutet darauf hin, das du namespace und nicht class willst.



  • Verstehe ich nicht 😞 Ich habe Die Funktion innerhalb der Klasse in der Header Datei deklariert und sie als Member der Klasse Routine in der cpp Datei implementiert. In der main möchte ich nun diese Funktion aufrufen und ihr als Argument einen Vektor übergeben.



  • Verstehen setzt Nachdenken voraus.



  • Ich habe darüber nachgedacht und weiss trotzdem nicht was da falsch ist.



  • Du versuchst eine Memberfunktion ohne Objekt aufzurufen. Mögliche Lösungen:

    • mach deine Funktionen static
    • erstelle ein Objekt deiner Klasse und rufe die Funtionen auf diesem Objekt auf
    • verwende einen namespace statt einer Klasse


  • Das war mir nicht klar. Ich merke mir das. Danke sehr Biolunar 🙂

    Ich habe die Methode static gesetzt und es läuft.



  • cpp_Jungspund schrieb:

    Ich habe die Methode static gesetzt und es läuft.

    Ja, du willst namespace.



  • Fürs Protokoll: public static Funktionen sind wahrscheinlich nicht das was du möchtest. Von dem Code den du geposted hast hat manni66 korrekt gefolgert, dass du einen namespace statt einer Klasse möchtest. Wenn du noch nicht weißt was ein namespace ist, lass es einfach so wie es funktioniert. Sobald du weißt was ein namespace ist, änder deinen Code 😉



  • @cpp_Jungspund
    Das was du da machst...

    cpp_Jungspund schrieb:

    ...
    // Class for routines and algorithms
    class Routine {
    ...
    

    ...riecht nach Java/C#-Background und/oder schlechtem Lehrer.

    In C++ macht man für so etwas keine Klassen, sondern verwendet zur Gruppierung von Funktionen Namespaces (grobe Aufteilung) bzw. Header Files (feinere Aufteilung).

    Falls es ein "schlechter Lehrer" Fall sein sollte kannst du vermutlich wenig machen - ausser halt nebenbei mitzulernen wie man es in C++ üblicherweise macht.



  • Hallo

    Ich habe mich heute mit Namensbereichen beschäftigt. In meinem Buch wird ein einleuchtendes Beispiel gewählt bei dem ein Programmierer eine Funktion log scheibt, welche einmal Log Dateien anlegt und noch eine weitere Funktion log welche einen Logarithmus berechnet. Der nutzen liegt also darin Namenskollisionen zu vermeiden. Okay, aber wieso soll ich dies hier benötigen? Ich habe doch keine Namenskollision.

    Worin liegt der Vorteil anstatt einer Klasse einen Namensbereich zu definieren? Gewinnt man da an Performance?

    @hustbaer
    Einen Lehrer habe ich nicht. Ich bringe mir das alles selbst bei mit Skripten und Bücher.


  • Mod

    Was wäre denn, wenn der Programmierer der Logarithmusfunktion und der Programmierer der Ereignislogfunktion genau so gedacht hätten wie du?



  • cpp_Jungspund schrieb:

    Der nutzen liegt also darin Namenskollisionen zu vermeiden.

    Ne, wirklich nicht.

    Du musst dir ein anständiges Buch suchen (Foren / Google Suche) und damit arbeiten.

    Und dann musst du Texte aufmerksam lesen und vollständig verstehen. Ich bin mir fast sicher, dass es sogar in dem Text den du gelesen hast erklärt wurde.
    Nur hast du dich auf 10% davon konzentriert, wohl ein Beispiel zu Namenskollisionen.



  • Stell Dir doch andersrum mal die Frage: Welchen Nutzen hat hier die Klasse? Keinen, also weg damit! Du brauchst weder Klasse noch Namespace - aber wenn die Funktion in irgendeiner Art Hierarchie haben willst, ist hier der Namespace die richtige Wahl, nicht die Klasse.


Log in to reply