Vektoren in Klassen



  • Hallo,

    ich versuche gerade ein kleines Programm zu schreiben welches Vektoren in einer Klasse definiert. Leider bekomme ich immer einen Segmentation fault.
    Ich habe noch sehr wenig Erfahrung beim Umgang mit Klassen und hoffe der angehängte Code ist annähernd verständlich...

    #include<cmath>
    #include<vector>
    #include<fstream>
    #include<iostream>
    
    using namespace std;
    
    // KLASSE
    class vektor {
    
    private:
    	vector<double> t1;
    
    public:
    	vector<double> e1;
    
    	vector< vector<double> > ausgabe(void);
    	void init(void);
    };
    
    // MEMBER FUNKTONEN
    void vektor::init(void) {
    
    	for (int i = 0; i < 2; i++) {
    		t1.push_back (e1[i]);
    	}
    }
    vector < vector <double> > vektor::ausgabe(void) {
    
    	vector< vector<double> >  ausg(2, vector<double>(2));
    
    	for (int p = 0; p < 2; p++) {
    		for (int i = 0; i < 2; i++) {
    			if (p == 0) ausg[p][i] = t1[i]+1.0;
    			else ausg[p][i] = e1[i]+1.0;
    		}
    	}
    
    	return ausg;
    }
    ////////////////////////////
    
    int main(void) {
    
    	vector< vector<double> > a(2, vector<double>(2));
    
    	vektor test;
    
    	// test.init();
    
    	test.e1[0] = 1.0;
    	test.e1[1] = 2.0;
    
    	a = test.ausgabe();
    
    	for (int p = 0; p < 2; p++) {
    		for (int i = 0; i < 2; i++) {
    			cout << a[p][i] << " "; 
    		}
    		cout << endl;
    
    	}
    
    	return 0;
    }
    

  • Mod

    Der einzige vector der irgendeinen Inhalt hat ist a. Bei all den anderen wird fröhlich auf nicht-vorhandene Elemente zugegriffen, denn sie sind alle leer.

    Beim Umgang mit vectoren solltest du auch die Vectormethoden wie size() benutzen. Alle Grenzen sind bei dir im Programm fest einprogrammiert. Es ist ja gerade der Vorteil von vector, dass die Grenzen nicht fest sein brauchen.

    Wenn du dich etwas sicherer fühlst, besser noch iteratoren statt Zählvariablen benutzen.

    Wenn ich eine Memberfunktion namens init() sehe, schrillen alle Alarmglocken. Guck dir mal an, was ein Konstruktor ist.



  • Außerdem solltest du im Normalfall
    1. "sprechende Namen" für Variablen verwenden
    2. Variablen alle private oder protected machen.



  • wxSkip schrieb:

    Variablen alle private oder protected machen.

    1. protected ist genauso schlimm wie public .
      1. Erkläre mal, wieso std::pair sein first und second als öffentlichen Member hat.


  • einspruch schrieb:

    wxSkip schrieb:

    Variablen alle private oder protected machen.

    1. protected ist genauso schlimm wie public .
      1. Erkläre mal, wieso std::pair sein first und second als öffentlichen Member hat.

    0. Warum?
    1. Ich sagte "Im Normalfall". Ich mache auch manchmal Variablen public. In dem Fall ist das durchaus akzeptabel, ich würde die init()-Funktion backup() oder update() nennen, aber ich kenne den Sinn des vektors nicht (übrigens hier auch kein sprechender Name).

    Wenn der Sinn ungefähr so ist, wie ich ihn erahne, könnte man z.B. e1 auch private machen und dann operator[] überladen, damit man nicht test.e1[1] sondern test[1] schreiben kann. Bei dieser Überladung könnte man dann auch Bound-Checking und eventuelle Größenänderung einbauen.



  • Vielen Dank einmal für die Denkanstöße! Vor allem das mit dem Konstruktor war mir eine große Hilfe. Ich habe bereits gemerkt, dass ich im Umgang mit Klassen noch einiges nachzuschlagen habe... 🙄

    aber ich kenne den Sinn des vektors nicht

    Dieser Code dient eigentlich nur zum Test ob ich das was ich über Objekt orientiertes programmieren gelesen habe auch schon verstanden habe. Anwendung soll es dann finden in einem meiner Programme (in C) welches ein elliptisches, eingeschränktes 3 Körperproblem löst. Die Eingabe der Daten erfolgt in Verschiedenen Koordinatensystemen und deshalb auch der Versuch diese Koordinatensysteme in Klassen zusammenzufassen. Kurzum nach einigen Versuchen und eurer Hilfe funktioniert der Code jetzt, allerdings bin ich nun bei der Aufspaltung in verschiedene Dateien auf das nächste Problem gestoßen: Der Compiler meldet dass die Dateien nicht gefunden werden können, oder nach Zusatz von

    #ifndef
    

    mittlerweile nur noch einen buid error

    Klassendefinition befindet sich in BCO.h
    Die Memberfunktionen in BCO.cpp
    BCO.h wurde in BCO.cpp mit #include "BCO.h" eingebunden
    und BCO.cpp in main.cpp mit #include "BCO.cpp"

    Ich habe bereis einige Beiträge dazu im Internet durchforstet aber leider noch nicht wirklich eine Anleitung (für Dummies) gefunden, wie man diese Dateien in der Entwicklungsumgebung XCode zu einem Objekt zusammenfügt.

    Vielen Dank!



  • Generell solltest du nicht cpp-Dateien in andere includen, außer du hast einen trifftigen Grund. Falls du mehr über Header und Sourcen wissen willst, habe ich mal einen ausführlichen Beitrag dazu geschrieben:
    http://www.c-plusplus.net/forum/p1993089#1993089
    Wie man seine Dateien in XCode verwaltet, weiß ich aber nicht.


Anmelden zum Antworten