`node' is an inaccessible base of `stadt_node'
-
Ja thx das wars, natürlich ist die Funktion danach deklariert.
Wie "deklariere" ich denn die 3 Unterklassen vor der Oberklasse das ich meine make_node Funktion als static Methode in die Oberklasse packen kann?
-
lars0 schrieb:
Ja thx das wars, natürlich ist die Funktion danach deklariert.
Wie "deklariere" ich denn die 3 Unterklassen vor der Oberklasse das ich meine make_node Funktion als static Methode in die Oberklasse packen kann?Gar nicht, wozu auch?
-
Ich würd die make_node Methode ja nicht in die node Klasse packen, sondern in eine extra Builder oder Factory Klasse. Google mal nach Factory Methode..
-
Ja hab nach einer Programmierpause in der Uni mit C++ angefangen, das Wissen ist ein wenig eingerostet ^^
Danke nochmal für die Tipps eine Frage ist noch offen:
Nehmen wir mal an ich möchte die Funktion aber als static in die node Klasse packen also...:
class foo
{
static void bla() { .... new special_foo() }
};class special_foo : public foo
{
...
};Dafür gabs doch wenn ich mich recht entsinne eine Art "Namedeklaration" damit das geht oder?
-
Wie CStoll schon sagte, du kannst die Funktion darunter definieren, oder am besten in eine eigene foo.cpp Datei und die Klassenschnittstellen in eine foo.h Datei
//foo.h #ifndef _FOO_H_ #define _FOO_H_ class foo { static foo* bla(); }; class special_foo : public foo { ... }; #endif //foo.cpp #include "foo.h" foo* foo::bla() { .... new special_foo() }Aber wie gesagt, ich würd das trennen. Mach ne weitere Klasse
//ungetestet und unvollständig!! #include <memory> //für auto_ptr class FooFactory { public: std::auto_ptr<Foo> create_foo() { ...return std::auto_ptr<Foo>( new special_foo() ) } //... };Und auto_ptr verringert hier die Gefahr ein Speicherleck durch fehlendes delete beim Aufrufer zu erzeugen
-
Ja ist mir schon klar das es so geht, nur weiß ich noch das es auch irgendwie per "Namedeklaration" der Klasse geht. Mich interessiert wie, Eleganz ist mir da egal

-
Kann es sein, dass du mit "namedeklaration" die "forwarddeclaration" meinst?
-
kA wie es richtig heisst
-
Dann weiss ich auch nicht.
Es geht jedenfalls nicht, wenn du Kopf und Implementation nicht trennst.
-
Der Grund ist ganz einfach: Du kannst nichts erzeugen, was nicht definiert wurde. Eine Deklaration reicht nicht.
Die Lösung wurde ja bereits genannt: Erst die Oberklasse definieren, dann die Unterklassen, dann die Methode der Oberklasse, welche die Unterklassen erzeugen muss.
-
Doch ich bin mir sicher da gab es etwas wie
class Abc;
Ist die Frage wie das mit Unterklassen aussiehtWas ist denn wenn man die static Methode inline macht? Dann ist nichts mehr mit außerhalb definieren? Da muss es einfach eine Möglichkeit geben
-
Lars schrieb:
class Abc;
Richtig. Eine Forwarddeklaration. Wurde ja bereits genannt. Reicht nicht um ein Objekt zu erzeugen, dazu muss mindestens die Größe bekannt sein (von der Verfügkarbeit von Konstruktoren ganz zu schweigen).
Was ist denn wenn man die static Methode inline macht? Dann ist nichts mehr mit außerhalb definieren.
Doch, mit dem Schlüsselwort "inline"
