klassenprobleme



  • HI.

    hier ist mein problemcode:

    class cCoo
    {
    public:
    	void SetCoo (int zahl)
    	{itsDat = zahl;}
    	int GetCoo ()
    	{return itsDat;}
    
    private:
    	int itsDat;
    };
    
    typedef vector <cCoo> MyDat;
    
    class GlobDat : public MyDat
    {
    public:
    	void SetMyDat (MyDat data)
    	{itsTest = data;}
    private:
    	MyDat itsTest;
    
    };
    
    int main()
    {
    	cCoo	PKT;
    	MyDat	TESTER;
    	GlobDat DATEN;
    
    	PKT.SetCoo(5);
    	TESTER.push_back(PKT);
    
    	DATEN.SetMyDat(TESTER);
    
    	cout << DATEN[0].GetCoo() << "\n\n";
    
    	return 0;
    }
    

    dazu gibts folgende fehler beim debuggen für zeile 37:

    Debug Assertion Failed!
    Expression: vector suscript out of range...

    kann mir dazu bitte jemand sagen, woran das liegt?
    DANKE!
    STICK.



  • dfsdfsdf



  • stick_thai schrieb:

    kann mir dazu bitte jemand sagen, woran das liegt?

    Lern Englisch. Dein GlobDat ist 'leer'.

    Auch ohne zu wissen was du vorhast: dein Klassendesign ist ziemlich übel, strick das um.



  • HI finix,

    danke für die antwort!

    finix schrieb:

    dein Klassendesign ist ziemlich übel, strick das um.

    fehlt den ausser konstruktor und destruktor noch etwas? oder beziehst du dich damit auf die zweite klasse GlobDat, die von MyDat abgeleitet ist?

    dann schreibst du:

    finix schrieb:

    Dein GlobDat ist 'leer'.

    int main()
    {
    	int i;
    	vector <int> vec,vec1;
    
    	for (i=0;i<3;i++)
    		vec.push_back(i);
    
    	vec1 = vec;
    
    	return 0;
    }
    

    warum funktioniert dann dieser code? am anfang ist vec1 doch auch leer und ich weise dieser variablen dann den werten von vec zu.

    DANKE.
    STICK.



  • Dieser Code hat auch nur einen vector.

    GlobDat enthält sozusagen zwei MyDat-Objekte, einen durch Vererbung und einen als Member.

    Du weist in deinem Code GlobDat::itsTest zu. Mit DATEN[0] greifst du aber nicht auf itsTest zu, sondern auf den vector, der in GlobDat drinsteckt, weil es von vector abgeleitet ist.



  • okay danke.

    ich überarbeite das dann mal!

    STICK.



  • OKAY.

    ich habe mir das gerade mal angeschaut. ist es in meinem dargelegten beispiel vielleicht besser, anstelle einer abgeleiteten klasse ein eingeschlossenes objekt zu benutzen? das würde dann so aussehen:

    class cCoo
    {
    public:
    	cCoo() {}
    	~cCoo(){}
    	void SetCoo (int zahl)
    	{itsDat = zahl;}
    	int GetCoo ()
    	{return itsDat;}
    
    private:
    	int itsDat;
    };
    
    typedef vector <cCoo> MyDat;
    
    class GlobDat
    {
    public:
    	GlobDat() {}
    	~GlobDat(){}
    
    	MyDat itsTest;
    
    	void SetMyDat (MyDat data)
    	{itsTest = data;}
    };
    
    int main()
    {
    	cCoo	PKT;
    	MyDat	TESTER;
    	GlobDat DATEN;
    
    	PKT.SetCoo(5);
    	TESTER.push_back(PKT);
    
    	DATEN.SetMyDat(TESTER);
    
    	cout << DATEN.itsTest[0].GetCoo() << "\n\n";
    
    	_getch();
    
    	return 0;
    }
    

    wäre halt dann hier das problem, dass man ja eigentlich die eigenschaften einer klasse als 'private' definieren sollte, richtig?

    DANKE für eure hinweise.
    STICK.



  • stick_thai schrieb:

    ist es in meinem dargelegten beispiel vielleicht besser, anstelle einer abgeleiteten klasse ein eingeschlossenes objekt zu benutzen?

    Ich verstehe nicht, wozu du die Klassen überhaupt brauchst. cCoo ist nur ein Container für int, und GlobDat ist nur ein Container für MyDat. Beide Klassen können sonst nichts. Sie abstrahieren oder vereinfachen nichts, sie machen nur die Benutzung komplizierter. Warum nicht so:

    typedef int cCoo;
    typedef vector<cCoo> MyDat;
    typedef MyDat GlobDat;
    
    int main()
    {
        cCoo    PKT;
        MyDat   TESTER;
        GlobDat DATEN;
    
        PKT = 5;
        TESTER.push_back(PKT);
    
        DATEN = TESTER;
    
        cout << DATEN[0] << "\n\n";
    
        _getch();
    
        return 0;
    }
    


  • MFK schrieb:

    Ich verstehe nicht, wozu du die Klassen überhaupt brauchst. Sie abstrahieren oder vereinfachen nichts, sie machen nur die Benutzung komplizierter.

    du hast recht, in dem hier dargelegten beispiel macht eine klasse sicher wenig sinn. aber in meinem programm enthält diese klasse weitere attribute und methoden, die ich der übersicht wegen entfernt habe. darum kann ich leider nicht gänzlich auf die klasse verzichten 😉


Log in to reply