Instanzen von Objekten anlegen?

hanni6al

Grünschnabel
Hallo!

Ich hoffe ihr könnt mir weiterhelfen folgendes ist gegeben
Code:
Class Base
{
private:
 Abstract_class* commands;
}

Code:
Class Abstract_class
{
}
]
Code:
Class Poly:public Abstract_class
{
private:
 getName() {return "poly";};
}
Code:
Class line:public Abstract_class
{
private:
  getName() {return "line";};
}

Ich will per new die konkreten Instanzen aller Abstract_class Objekte erzeugen und in den Abstract_class* commands_ Array speichern!

Wie kann mand das angehen ich weis einfach nicht mehr weiter wäre super wenn mir da jemant weiterhelfen könnte!

mfg
 
Wann und wo willst du die Objekte denn Anlegen?

Ich will per new die konkreten Instanzen aller Abstract_class Objekte erzeugen und in den Abstract_class* commands_ Array speichern!
Eine Instanz einer Klasse ist immer ein Objekt. Also Klasseninstanz = Objekt. Du meinst wohl aller Klassen an die Abstract_class vererbt wurde.
Oder möchtest du das während der Luafzeit entschieden wird welche get_Name Funktion aufgerufen wird? deine klasse Abstract_class ist bislang noch nicht abstrakt vielleicht solltest du dazu erst einmal ein Tutorial durcharbeiten!
 
Zuletzt bearbeitet:
C:
class Abstract_class
{
};

class Poly:public Abstract_class
{
private:
	char* getName() {return "poly";};
};

class line:public Abstract_class
{
private:
	char* getName() {return "line";};
};

class Base
{
private:
	Abstract_class* commands;
};

int main(int argc, char* argv[])
{
	Abstract_class* commands_Array[2];
	commands_Array[0] = new Poly;
	commands_Array[1] = new Line;
	
	system("pause");
	return 0;
}

Hier mal als kleines Bsp.
Du kannst dir ja eine Funktion schreiben die das Array vergrößert oder verkleinert je nach Bedarf (also in deine Klasse dann) oder du benutzt eine verkettete Liste.
 
So das nächst Problem
Code:
class Interface
{
private:
  Basis* commands_[3];
public:
  Interface() ;
  ~Interface(){};
};

class Basis
{
protected:
 Interface& i_;
public:
  Basis();
  ~Basis();
 virtual char* getName() =0;
};

class Ableitung:public Basis
{
public:
  Ableitung() {cout<<"Konstruktor Ableitung1"<<endl;};
  ~Ableitung() {cout<<"Destruktor Ableitung1"<<endl;};
  char* getName() {return "Ableitung";};
};
Nächstes Problem ich kann einfach nicht das Array of Objects Pointers anlegen! Und zwar wollte ich es so machen:
Code:
Interface::Interface()
{
    Basis* commands_[3];    
}

Code:
int main()
{
 Interface::commands_[0] = new Ableitung;
}

Stehe auf der Leitung

mfg
 
Zuletzt bearbeitet:
Hallo hanni6al,

da du verschwiegen hast, welche Fehlermeldungen auftauchen, kann ich leider nur raten bzw. sagen, was mir spontan auffällt:

  1. Bei der Deklaration von Interface ist die Klasse Basis noch nicht bekannt, da du diese erst hinterher deklarierst. Das löst man am besten mit einer Forward-Deklaration von Basis.
  2. Der Konstruktor von Interface ist sinnlos, da er nur aus einer Deklaration einer lokalen Variable besteht.
  3. Du versuchst in deiner main-Methode auf eine als private deklarierte Membervariable von Interface zuzugreifen.
  4. Der Destruktor von Basis sollte besser virtuell sein.

Mehr fällt mir auf den ersten Blick nicht auf.

Grüße, Matthias
 
Da gibt es gernichts zu raten!

C:
Interface::Interface()
{
    Basis* commands_[3];    
}
Das Problem liegt ganz einfach darin, dass du ein Zeiger-Array in einer Funktion anlegts, d.h. dein Array wird am Ende der Funktion gelöscht. Du musst dies in der Interface-Klasse private oder public anlegen. Sag bescheid falls du die Array-größe während der Laufzeit verändern willst, dann gebe ich dir dazu ein Code Beispiel.
 
Da gibt es gernichts zu raten!
Tatsächlich?

C:
Interface::Interface()
{
    Basis* commands_[3];    
}
Das Problem liegt ganz einfach darin, dass du ein Zeiger-Array in einer Funktion anlegts, d.h. dein Array wird am Ende der Funktion gelöscht.
Das habe ich bereits in Punkt 2. erwähnt.

Du musst dies in der Interface-Klasse private oder public anlegen.
Lies dir den Quellcode von hanni6al nochmal sorgfältig durch. Er hat bereits eine private Membervariable deklariert.

Grüße, Matthias
 
Zurück