Problem mit abstrakten Klassen / Rückgabewert von Funktionen
-
Hallo zusammen,
ich habe folgende Situation:
Ich habe eine abstrakte Klasse AbctractClass, die zwei (nicht abstrakte) Unterklassen InheritedClass1 und InheritedClass2 besitzt. Nun ist es notwendig, die Attribute der Unterklassen in Dateien zu schreiben, so dass die Objekte bei Bedarf in einem späteren Durchlauf des Programms reproduziert werden können.
Die Funktion zum Schreiben der Attribute ist kein Problem. Das Einlesen an sich auch nicht, es funktioniert wunderbar über eine statische Methode.
Allerdings wäre es schön, wenn man eine einzige Methode zum Einlesen hätte, die dann durch einen Parameter entscheidet, ob sie nun ein Objekt von der ersten oder der zweiten Unterklasse erstellen soll, sodass Aufrufe in dieser (oder ähnlicher Form) möglich sind:AbstractClass a = AbstractClass::read("file.bin");a müsste dann also entweder ein Element von InheritedClass1 oder InheritedClass2 sein, je nachdem, welcher Parameter in file.bin geschrieben hineingeschrieben wurde.
Vielen Dank schon mal für die Hilfe,
Nico
-
Wo genau liegt das Problem? read() muss eben checken, was für ein Objekt da in der Datei steht und ein entsprechendes Objekt erzeugen!?
-
Und das ist halt je nachdem entweder die eine oder die andere Unterklasse, davon hängt der Rückgabewert der Funktion ab. Der Aufruf wie oben geht nicht, weil es sich um eine abstrakte Klasse handelt.
-
Das einzige Problem, das ich da oben seh, ist, dass deine Funktion offenbar ein AbstractClass Objekt statt eines Pointers auf eine AbstractClass returned...
-
Ah okay, super, das hilft schon mal

War eine blöde Idee, ein Objekt der abstrakten Klasse zurückgeben zu wollen, wenn man mal (noch nicht einmal zwingend genauer) drüber nachdenkt
Jetzt stellt sich mir ein weiteres Problem beim Aufruf. Wenn ich die Funktion nicht aufrufe, lässt sich der Code einwandfrei kompilieren.
Beim AufrufAbstractClass* a = AbstractClass::read("file.bin");kommt nun jedoch die folgende Fehlermeldung:
Undefined symbols for architecture x86_64:
"AbstractClass::read(char const*)", referenced from:
TestRead() in Linear Algebra.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit statusDie Implementierung an sich ist richtig, und der Aufruf müsste eigentlich auch zur Signatur der Methode passen:
static AbstractClass* read(const char* Filename);Wahrscheinlich ein ziemlich blöder Fehler, aber ich schein gerade ein Brett vorm Kopf zu haben
-
Der Linker findet die Funktion nicht. Vermutlich weil du vergessen hast, die entsprechenden Object Files anzugeben? Oder ist das Ding in einer Library!?
-
Was macht das static da?
-
Und damit sind nun alle Probleme gelöst, es läuft alles prima. Besten Dank

-