Klasse mit Vektoren



  • Hallo liebe Forummenschen!
    Beim Programmieren ist mir eine Frage eingefallen die mir helfen würde mein Programm strukturierter zu machen.
    Ich würde gerne ein Attribut meiner Klasse zu einem Vektor machen damit ich die Adjazenten Kantenindexe da reinpushen kann.

    #include<vector>
    #include<iostream>
    #include<cmath>

    class Vertex
    {
    public:
    Vertex(void);
    ~Vertex(void);

    private:
    int v;
    vector<int> Edge;
    };

    Beim schreiben hat er mir bereits gesagt:
    Error: vector ist keine Vorlage
    1. Was meint er damit?
    2. Wie sollte das richtig aussehen.

    ==============

    Eine Nebenfrage. Ich habe versucht aus einer Datei möglichst optimal Daten auszulesen. Dabei bin ich im Forum auf diesen Trick gestoßen:
    (Quelle) ist mein ifstream

    Quelle>>Knotenanzahl>>Kantenanzahl;	// -- FUNKTIONSFÄHIG
    
        for(int i = 0; i < Kantenanzahl; i++){
    		int a,b,gew;
    		Quelle >> a >> b >> gew;
    	}
    

    Dabei frage ich mich wie dieser Operator ">>" in diesem speziellen Fall arbeitet?
    Ich lese aus einer .txt Datei aus und ich dachte aus Textdateien ließt man in der Regel strings aus. Hier kann er aber 1. die Leerzeichen und Zeilenumbrüche überspringen und nimmt sich immer nur die Zahlen raus.
    Über cin hab ich gelesen dass es genau so arbeitet, aber cin steht da nicht.
    get() nimmt sich jedes Zeichen und getline ignoriert nur \n. Oder ist das irgendwie anders?

    Datei.txt
    5
    6
    0 1 2
    2 1 2
    2 3 2
    3 1 1
    0 2 3
    3 4 2



  • Es muss lauten

    std::vector<int> Edge;
    

    da vector sich Namespace std befindet. Alternativ geht es auch mit

    using std::vector;
    

    womit man jedoch sparsam umgehen sollte und vor allem in headern vermeiden.

    Zu deiner zweiten Frage: Was ist den Quelle?



  • Danke!
    Noch eine anschließende kleine Frage. Warum sollte man damit sparsam umgehen?
    Und noch viel wichtiger. Warum sollte man das in Headern nicht machen?
    Gibt es eine bessere Möglichkeit einen Vector in einer Klasse zu verwenden? Oder sollte ich das allgemein vermeiden?

    Ich hatte Quelle noch editiert während du geschrieben hattest. Oben ist Quelle bereits als ifstream markiert.



  • Using Directives sind in headers gefaehrlich, da derjenige, der den header in seinem .cpp file inkludiert vielleicht nicht weiss, dass im header diese using Directive ist.
    Das kann zu ungewollten Namenskollisionen kommen.

    Ein (aehnliches) Beispiel von Namenskollision, das mir mal passiert ist:
    In der Standardbibliothek im namespace std gibt es eine Funktion std::swap(...). Ich wusste das nicht und wollte eine eigene Implementierung von swap(...) schreiben. Da ich jedoch using namespace std in meinem Code hatte gab das merkwuerdige Fehler, die ich mir einige Zeit nicht erklaren konnte.

    Daher auch Sparsam mit

    using namespace std; // oder welcher namespace auch immer
    

    umgehen.



  • eine klasse kann alles als member haben wenn das gebraucht wird. auch vectoren, du müsst nur dann halt im hinterkopf haben, dass kopieren länger dauert

    warum man using nicht spammen sollte?
    du weist was namespaces sind? die sind dafür da, nochmal eine unterteilung vorzunehmen (z.b. wenn firma a eine bibliothek schreibt und firma b auch, beide haben libs sind zwar für verschiedene sachen, haben aber z.b. klassen oder funktionen die gleich heissen, aber unterschiedliches machen. das würde sich also beissen, und namespaces geben noch einen zusätzlichen namen mit, so könnte man das erklären), vergleichbar mit packages in java

    wenn du diese namespaces aber jetzt ausschaltest, eben durch using direktiven in headern, dann hebelst du den gesamten gedanken der namespaces aus und machst sie nutzlos. denn alles was deinen header (mit den usings) verwendet kennt auch die benutzten elemente des geusedten namespace und zwar auf globaler ebene (bei dem beispiel mit der firma gibt es dann linker errors, da gleiche sachen ja mehrmals definiert worden sind. unter umständen)

    Also Merkregel: in Headern nie using, immer komplett ausschreiben (oder typedefs). in cpp dateien kannst du das hinschreiben, das stört keinen, da die ja nicht eingebunden werden...



  • Danke für die Antworten. Das Programm schreibe ich bereits weiter. Weiß noch jemand etwas zu meiner zweiten Frage?



  • mh, da sollte eher jemand was zu sagen, der die iostreams auch versteht...

    es ist ja so:
    es gibt inputstreams und outputstreams. beide können verschiedene ziele haben, also z.B. dateien(ifstreams ofstream), console(cin cout), bestimmte speicherbereiche wie im falle von stringstream. und man kann sicherlich noch weitere bauen (oder man leitet die standardausgabe um, die pipe unter linux z.B.)

    für diese streams sind die operationen >>(istreams) und <<(ostreams) definiert, klar sie zeigen was an bzw. lesen was ein. und zwar existieren hierfür eine reihe überladungen, für string, für char*, für int, für float, double... usw. und das sowohl zur ein- als auch ausgabe (wieder leicht vergleichbar wie der java.util.Scanner)
    so und beim eingelesen wird erstmal eine gewisse anzahl an bytes eingelesen, nämlich bei >> hört es bei einen whitespace auf(leerzeichen oder enter oder so), danach wird versucht das eingelesene in den entsprechenden datentyp zu quetschen (den typ und auch die zeielvariable gibt man ja an -> istream >> zielVar;). und klappt das nicht werden die failbits gesetzt und der stream "blockiert" danach, bis du alles wieder in einen arbeitsfähigen zustand bringst (clear() usw.)

    bei der ausgabe ists umgekehrt, man versucht den datentyp nach einem ausgabefähigen typ zu konvertieren (im simpelsten fall char*) und schreibt das dann auf das ausgabe medium

    so, und wie du gemerkt hast, funktioniert das überall gleich: wie ein spielzeugauto, was immer weiter gerade ausfährt, sprich die räder drehen sich. du kannst es auf den tisch setzen und es fährt, du setzt es auf den boden und es fährt, du setzt es sonstwohin und es fährt (die geschwindigkeit ändert sich natürlich auch, bei beiden beispielen, streams <--> auto)



  • Ich lese aus einer .txt Datei aus und ich dachte aus Textdateien ließt man in der Regel strings aus. Hier kann er aber 1. die Leerzeichen und Zeilenumbrüche überspringen und nimmt sich immer nur die Zahlen raus.
    Über cin hab ich gelesen dass es genau so arbeitet, aber cin steht da nicht.

    ifstream ist auch nur ein istream, funktioniert ergo praktisch identisch wie std::cin. 😉



  • Danke!
    Damit wären schon alle meine Fragen beantwortet 😃


Anmelden zum Antworten