Problem mit Klassenarray

lukasS

Erfahrenes Mitglied
Hallo,

nun habe ich ein Problem gelöst und schon kommt das nächste. Ich habe mir eine template Klasse aus dem Internet ausgeliehen, die genau das macht, was ich brauche. Sie kann mehrere Klassen speichern, die mit einem index angesprochen werden. Das klappt auch wunderbar, wenn ich das nur in der main benutze. Ich bräuchte sowas aber global. Mit VC++ klappt das auch, aber nicht mit dem Borland C++ 4.5. Beim Schließen der Anwendung kommt die Fehlermeldung "Allgemein Schutzverletzung...".

Ein frage vorweg. Ich muss mit diesem Compiler arbeiten, da das ein Schulprojekt ist und wir eben keine anderen nehmen dürfen. Hier ist der KOT der Klasse:

Code:
const int DefaultSize = 20;

template <class T>  // Das Template und den Parameter deklarieren
class classArr            // die parametrisierte Klasse
{
public:
	// Konstruktoren
	classArr(int itsSize = DefaultSize);
	classArr(const classArr &rhs);
	~classArr() { delete [] pType; }

	// Operatoren
	classArr& operator=(const classArr&);
	T& operator[](int offSet) { return pType[offSet]; }
   const T& operator[](int offSet) const
		 { return pType[offSet]; }
   // Zugriffsfunktionen
   int GetSize() const { return itsSize; }

private:
	T *pType;
   int  itsSize;
};

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Implementierungen

// Konstruktor
template <class T>
classArr<T>::classArr(int size):
itsSize(size)
{
	pType = new T[size];
	for (int i = 0; i<size; i++)
		pType[i] = 0;
}

// Kopierkonstruktor
template <class T>
classArr<T>::classArr(const classArr &rhs)
{
	itsSize = rhs.GetSize();
	pType = new T[itsSize];
	for (int i = 0; i<itsSize; i++)
		pType[i] = rhs[i];
}

// =-Operator
template <class T>
classArr<T>& classArr<T>::operator=(const classArr &rhs)
{
   if (this == &rhs)
      return *this;
   delete [] pType;
   itsSize = rhs.GetSize();
   pType = new T[itsSize];
   for (int i = 0; i<itsSize; i++)
      pType[i] = rhs[i];
   return *this;
}

Da ich davon NOCH nicht so viel Ahnung habe, bitte ich um eine etwas einfachere Hilfestellung.

Danke schonmal!

Lukas
 
Danke erstmal für deine Hilfe.

Ich glaube im code ist auch kein Fehler vorhanden.

Code:
classArr <myClass> klasse;

int main()
{
   klasse[0].methode();
   klasse[1].methode();
   //usw.
}

Ich habe hier die includes weggelassen. Wie gesagt, erst beim Schließen der Anwendung kommt die Fehlermeldung. Kann es vielleicht sein, dass die Klasse den Destruktor nicht benutzt und deshalb iregendwelche Speicherfehler auftreten?
 
Schwer zu sagen, ohne kompletten Code. Der Destruktor sollte aber problemlos aufgerufen werden. Du kannst ja testweise mal aus die Deklaration von klasse innerhalb von main() machen -- könnte sein, das es dann geht, wenn es wirklich ein Compilerproblem ist.

Was ich übrigens merkwürdig finde, ist, dass myClass anscheinend kein numerischer Typ ist (wegen .methode() ). Dann dürfte das
Code:
	for (int i = 0; i<size; i++)
		pType[i] = 0;
im Konstruktor eigentlich nicht funktionieren. Oder kannst du an ein Objekt vom Typ myClass 0 zuweisen? Ich verstehe nicht, wie das überhaupt kompiliert werden kann.
 
Ich habe testweise eine Ausgabe in den Destruktor hineigeschrieben. Es wurde nicht am Bildschirm angezeit. Ich weiß nicht.

Also, in das template kann ich auch ein int oder string oder eben myClass hineinpacken. Die werden dann irgendwie im Pointer gespeichert. Wie das genau abläuft, weiß ich noch nicht. Bin ja nur ein Azubi.

Ich habe noch ein kleines Testprojekt erstellt. Hier ist die Orginal main:

Code:
#include <iostream.h>
#include <conio.h>

#include "classarr.h"

classArr <Kunde> kunden;

int main()
{
	cout << "hallo";
	getch();

	return 0;
}

Es tritt das gleich Problem auf. Wenn ich aber das classArr in der main aufrufe, dann klappt alles. Nur ich brauche das global und nicht nur in der main.
 
Es tritt das gleich Problem auf. Wenn ich aber das classArr in der main aufrufe, dann klappt alles. Nur ich brauche das global und nicht nur in der main.
Ah. Also, Folgendes geht, richtig?
Code:
int main()
{
        classArr <Kunde> kunden;
	cout << "hallo";
	getch();

	return 0;
}
Tritt das gleiche Problem auch auf, wenn du statt Kunde -Objekten int in das Array steckst? Probiere das mal, um auszuschliessen, dass es an der enthaltenen Klasse liegt.
 
Zuletzt bearbeitet:
Nein, dann läuft alles reibungslos. Liegt es vielleicht an meiner Klasse? Aber bis heute hatte ich mir der Klasse keine Probleme gehabt.

Hast du eine Idee?
 
Die einzige Idee ist: Schick den kompletten Code. Dann können zumindest die Leute, die den selben Compiler wie du verwenden, den Fehler mal austesten.

Ich könnte mir deine Klasse ansehen und gucken, ob es Probleme geben könnte. Oft treten Fehler in Klassen erst dann auf, wenn sie unter komplexeren Umständen verwendet werden (z.B. in Array-Template).

Übrigens: Ich nehme mal an, dass das Template für die Array-Klasse zum Unterricht gehört, oder warum verwendet ihr nicht std::vector? Eine bessere Alternative zur Array-Kapselung selbst zu schreiben dürfte schwierig sein.
 
Zuletzt bearbeitet:
Gerade als ich das Projekt auf die schnelle verkeilnern wollte. Lief es aufeinmal. Ich fand durch die deine Idee, dass es an meinen Klasse liegen könnte, heraus, dass eine Klasse den Fehler verursacht hat. Ich habe nämlich noch eine Klasse stringArray erstellt, damit ich ein Array auf Basis des CStringArrays habe. Ein Array, bei dem ich beim Deklarieren keine Größenangeben machen muss. Das kleine Testprojekt von geradeeben hatte im Header diese Klasse inkludiert. Ich werde das noch weiter testen.

Warum diese Klasse fehlerhaft ist, weiß ich nicht. Naja, hauptsache ich kann seit Stunden wieder weiter arbeitn.

Gibt es vielleicht ein Array, bei dem ich beim Deklarieren kein index angeben muss, also auf Basis der CStringArrays?

Danke nochmal für deine Hilfe und Mühe! Jetzt weiß ich endlich woran es lag.

[edit]
Von Vectoren habe ich noch nichts gehört. Kommt noch alles...
[/edit]
 
Gibt es vielleicht ein Array, bei dem ich beim Deklarieren kein index angeben muss, also auf Basis der CStringArrays?
Ja den von Kachelator angesprochene std::vector.
Das ist nix anderes als ein Template-Array, also ein generisches Array mit wahlfreiem Zugriff.

Gruß Homer
 
Zurück