vector : Objektverwaltung

EntonH

Grünschnabel
Hallo,

zur Verwaltung von Objekten einer selbsterstellten Klasse kam mir in den Sinn einen Vector zu verwenden.

Wie genau muss ich denn da vorgehen?

Ich dachte mir das so:

In der Headerdatei steht:
vector<MeineKlasse> mK_vec;
MeineKlasse* myMeineKlasse;

Innerhalb einer Funktion der übergeordneten Klasse steht nun:
myMeineKlasse = new MeineKlasse();
Dann rufe ich über myMeineKlasse->init(Werte);
eine Funktion in der untergeordneten Klasse auf.

Und nur wenn diese erfolgreich ist, möchte ich
mK_vec.push_back(myMeineKlasse) ausführen.

Beim Einfügen in den Vektor bekomme ich jedoch einen Fehler.
(Meine ausgeführte .exe stürzt einfach ab)

Kann mir jemand sagen wieso das so ist?

Viele Grüße
EntonH
 
Hi.
In der Headerdatei steht:
vector<MeineKlasse> mK_vec;
MeineKlasse* myMeineKlasse;
In eine Header Datei gehören keine Definitionen. Wozu ist die globale Zeigervariable gut?
Innerhalb einer Funktion der übergeordneten Klasse steht nun:
myMeineKlasse = new MeineKlasse();
Dann rufe ich über myMeineKlasse->init(Werte);
eine Funktion in der untergeordneten Klasse auf.

Und nur wenn diese erfolgreich ist, möchte ich
mK_vec.push_back(myMeineKlasse) ausführen.
Das sollte eigentlich gar nicht kompiliert werden. Du hast in deinem Vektor Objekte vom Typ "MeineKlasse", versuchst allerdings ein Objekt vom Typ "Zeiger auf MeineKlasse" einzufügen.
Beim Einfügen in den Vektor bekomme ich jedoch einen Fehler.
(Meine ausgeführte .exe stürzt einfach ab)

Kann mir jemand sagen wieso das so ist?
Zeig konkreten Kode. Wie sieht die Klasse aus? Hast du Kopier-, Default-Konstruktor und Zuweisungsoperator definiert?

Mach am besten ein minimales Beispiel. Evlt. verstehst du selber besser was passiert.

Gruß
 
Also...ich habe den Code jetzt wie folgt abgeändert:
Code:
MeineKlasse* myMeineKlasse_ptr = new MeineKlasse
(getDictElementString(logger, "producer"),
getDictElementInt(logger, "hwType"), 			
getDictElementInt(logger, "hwChan"), 
getDictElementInt(logger, "serialnumber"), 
getDictElementInt(logger, "bitrate"),
getDictElementString(logger, "sLogFileName"));

retVal = myMeineKlasse_ptr->init();

if(retVal > 0)
{
     vK_vec.push_back((*myMeineKlasse_ptr)); <- an dieser Stelle fliegt er raus
}

Die Konstruktoren und den =-Operator habe ich definiert.

Muss ich die Größe irgendwie vordefinieren?
Ich möchte die Liste oder den vector überall in meiner übergeordneten Klasse verwenden, die die Objekte erzeugt, um über diesen auf die einzelnen Funktionen zugreifen zu können.

Bspw.:
Code:
vector<MeineKlasse>::size_type sz = vK_vec.size();
vec_size = (int)sz;
for(int i = 0;i < vec_size;i++)
{  
   retVal = vK_vec[i].deinit();	
   if(!retVal)
   {
       break;
   }
}
 
Hi.
Also...ich habe den Code jetzt wie folgt abgeändert:

MeineKlasse* myMeineKlasse_ptr = new MeineKlasse
Wozu verwendest du hier einen Zeiger? Ich nehme mal an, du gibst den Speicher auch nicht wieder frei, oder?
retVal = myMeineKlasse_ptr->init();

if(retVal > 0)
{
vK_vec.push_back((*myMeineKlasse_ptr)); <- an dieser Stelle fliegt er raus
}
Dann sind vermutlich deine Konstruktoren fehlerhaft. Ohne konkreten Code... :rolleyes:
Muss ich die Größe irgendwie vordefinieren?
Nein, push_back fügt ein Element am Ende des Vektors an.
Ich möchte die Liste oder den vector überall in meiner übergeordneten Klasse verwenden, die die Objekte erzeugt, um über diesen auf die einzelnen Funktionen zugreifen zu können.
Das ist keine Grund den Vektor in der Headerdatei zu definieren. Es reicht die Deklaration.

Gruß

PS: Bitte verwende für dein Code die entsprechenden Code Tags!
 
Wie sieht denn eine Deklaration in der Header-Datei aus?
Nicht:
Code:
vector<MeineKlasse> vK_vec;

Konstruktor:
Code:
MeineKlasse::MeineKlasse(string producer,
			  int hwType, 
			  int hwChan, 
			  int serialnumber, 
			  int bitrate,		
			  string sLogFileName)
{
	this->producer		= producer;
	this->hwType		= hwType;
	this->hwChan		= hwChan;
	this->serialnumber	= serialnumber;
	this->bitrate		= bitrate;
	this->sLogFileName  = sLogFileName;
	inst_cnt++;
	isOnline = false;
}

Copy-Konstruktor:
Code:
MeineKlasse::MeineKlasse(const MeineKlasse& temp)
{	
	producer		= temp.producer;
	hwType		= temp.hwType;
	hwChan		= temp.hwChan;
	serialnumber	= temp.serialnumber;
	bitrate		= temp.bitrate;
	sLogFileName	= temp.sLogFileName;
}

=-Operator:
Code:
const MeineKlasse& MeineKlasse::operator=(const MeineKlasse &vK)
{
   if (this == &vK)
      return *this;
     producer			= vK.producer;
	hwType			= vK.hwType;
	hwChan			= vK.hwChan;
	serialnumber	= vK.serialnumber;
	bitrate			= vK.bitrate;
	sLogFileName	= vK.sLogFileName;
   return *this;
}

Objekterzeugung, Aufruf einer Funktion und Ablegen m Vector:
Code:
MeineKlasse myMeineKlasse (getDictElementString(logger, "producer"),
	getDictElementInt(logger, "hwType"), 					getDictElementInt(logger, "hwChan"), 					getDictElementInt(logger, "serialnumber"), 
	getDictElementInt(logger, "bitrate"),
	getDictElementString(logger, "sLogFileName"));

retVal = myMeineKlasse.init();

vK_vec.push_back(myMeineKlasse);

Danke für deine Mühe :)
 
Hallo,

sind denn meine Konstruktoren und mein überladener Operator so korrekt?

Hat jemand eine Idee?

Viele Grüße
EntonH
 
Hi.
Wie sieht denn eine Deklaration in der Header-Datei aus?
Nicht:
Code:
vector<MeineKlasse> vK_vec;
So:
C++:
extern vector<MeineKlasse> vK_vec;
Die Definition muss dann in einer .cpp Datei stehen.

Deine Konstruktoren und der Assignment-Operator sehen eigentlich ganz gut aus. Nimm einen Debugger und schau nach bei welcher Anweisung innerhalb von push_back er wirklich abbricht. Wie ist denn eigentlich die Fehlermeldung?

Gruß
 
Zurück