pointer / schreibweise erlaubt?

Du bist neu in der Welt von C++? Dann schau hier herein!
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

pointer / schreibweise erlaubt?

Beitrag von DBGTMaster »

Hallo,

ist folgende Screibweise erlaubt?? Klasse B wurde von Klasse A geerbt, also "class B : public A { }":

Code: Alles auswählen

A* pointer;
pointer = new B;
Wird bei der ersten Zeile bereits der Speicher reserviert oder passiert das erst in der Zweiten Zeile??
Wird der Speicher von "A" oder "B" reserviert, bzw. produziere ich durch den Code eventuell einen Programmabsturz??

lG
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: pointer / schreibweise erlaubt?

Beitrag von franzf »

Stichwort "Basisklassenzeiger". Denke unbedingt an einen virtuellen Destruktor in A.
Speicher wird erst mit dem "new" alloziiert - ist ja gerade der Witz an Zeigern. Da du mit new ein "B" erzeugst, wird natürlich der Speicher passend für "B" angefordert.
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: pointer / schreibweise erlaubt?

Beitrag von DBGTMaster »

Ist die obengeannte Schreibweise auch ohne Pointer zu lösen?

Also so sieht der Code aus:

Code: Alles auswählen

        TcpAbstractCommand* command = 0;

        if (action == "userLogin") {
            command = new TcpCommand_main_userLogin();
            command->setCommandName("main", "userLogin");
        }
        if (action == "serverVersion") {
            command = new TcpCommand_main_serverVersion();
            command->setCommandName("main", "serverVersion");
        }
Ich denk mal, die Antwort lautet nein, oder?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: pointer / schreibweise erlaubt?

Beitrag von RHBaum »

DIe frage ist, muss dein new TcpCommand_main_userLogin unbedingt aufn freestore ...
und wie lange muss das "command" leben ?
Deine Virtualitaet sollte weniger das Problem sein ...
Aber der LifeCycle koennte zum Problem werden, der dich auf Zeiger zwingt.

aber statt rohe pointer kannst du smartpointer verwenden.
schau dir scoped pointer an und shared pointer.

BTW, soll das ne Umsetzung vom Kommand Pattern sein ?

Lager das erzeugen von commandos besser in ne Factory methode aus, oder iss das scho teil ner Factory ?
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: pointer / schreibweise erlaubt?

Beitrag von DBGTMaster »

Hallo,

shared Pointer wird auch verwendet, nur in diesem minimalen Beispiel nicht...

Prinzip der ganzen Sachen ist:

Client sendet Server eine Aktion, und anhand der übermittelten Aktion spielt der Server bestimmte Dinge ab...

Wie genau soll ich hier eine Faktory Klasse verwenden??

lG
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: pointer / schreibweise erlaubt?

Beitrag von RHBaum »

Naja, nur eine function die in der Lage ist, Command objecte zu erzeugen, in abhaengigkeiten von den Parametern.
So verlagerst die eigentlich haesslichen If() konstrukte in ne Geschlossene Funktion.

Ciao ...
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: pointer / schreibweise erlaubt?

Beitrag von DBGTMaster »

Hallo,

also meinst du:
command = getCommand(args);
So ist es eh geplant, aber danke :)
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: pointer / schreibweise erlaubt?

Beitrag von RHBaum »

Jupp, genau sowas ...

aber in dem Falle (wenn du diese Semantic haben woelltest) muesste dein "command" ne verwaltungsklasse fuer freestore Objecte sein.
und deine freestore Objecte kopierbar sein, durch movesemantic, refzaehlung oder richtiges kopieren(clonen in dem falle ^^)

Das ist schon gutes Design, aber sehr aufwendig eigentlich.
Sowas Lohnt meist nur, wenn das die Grundlage fuer nen etwas groesseres Framework ist, und andere auch mit arbeiten muessen.

So "unsauber" ist deine erster Ansatz auch nicht, und fuer kleinere Projekte sicher praktikabel ...

Also musst du entscheiden, was fuer einen Aufwand du treiben willst/musst.
Ins Design kann man auch Mann-Jahre stecken ohne das was effektiv bei rauskommt ... wenns einfacher code auch tut und den eh kein anderer sehen wird ^^
Selbst in groesseren Projecten zieht man das meist nur an Schluessel-Funktionalitaet durch ....

Ciao ...
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: pointer / schreibweise erlaubt?

Beitrag von DBGTMaster »

Eine Frage hätte ich noch:

Sagen wir mal, ich hätte 1000 verschiedene Commands, welche abgefragt werden müssen (sprich 1000 IF- Abfragen)...

Daher wäre mir am liebsten, dass diese commands automatisch eingetragen werden und ich nicht immer daran denken muss, einzutragen...

Würdet ihr dafür ein eigenen Precompiler- Skript verwenden?? Oder wie würdet ihr solches lösen?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: pointer / schreibweise erlaubt?

Beitrag von franzf »

Es gäbe viele Lösungen. Ein zur Compilezeit würde ich nicht wählen, da für neue Commands erst alles neu kompiliert werden müsste.
Denkbar wäre ein Plugin-System.
* Jedes Command kommt in ein Plugin.
* Jedes Plugin erhält eine CommandFactory, die das eine Command erzeugt
* Die jeweilige Plugin-CommandFactory registriert sich (this, "CommandName") bei der eigentlichen CommandFactory
* Dabei wird die Plugin-CommandFactory in eine map<QString, CommandFactoryBase*> gespeichert.
* Das Laden eines Commands holt sich über die Map die passende Factory uns erstellt eine Instanz des Commands.

Alle verfügbaren Plugins stehen in einer Config-Datei. Plugins können während der Laufzeit hinzugefügt werden (kein "Shutdown" der Server-Applikation nötig). die Map ist schnell aktualisiert (aktualisierte Plugins un- und reloaden, neue Plugins hinzufügen).

Das obige Schema ließe sich auch ohne Plugins verwenden, da sind die Plugins halt "statisch" in der Exe einkompiliert, die Factories können in der Art aber trotzdem bestehen.
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: pointer / schreibweise erlaubt?

Beitrag von DBGTMaster »

Hallo,

wie kann ich ein "Plugin" verstehen?? eine *.lib File??

// Edit: Oder sind hier QT Plugins gemeint, gerade in der Doku gefunden :)

lG
Zuletzt geändert von DBGTMaster am 24. August 2011 16:05, insgesamt 1-mal geändert.
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: pointer / schreibweise erlaubt?

Beitrag von DBGTMaster »

Also in der Praxis mal erzählt:

Ich habe eine AbstractCommand, und eine AbstractCommandFactory Klasse....

Jede LIB erbt die AbstractCommand, und erzeugt den Befehl, dann erbt die LIB auch noch die AbstractCommandFactory, welche eine Klasse darstellt, um den Command zu erzeugen, korrekt??
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: pointer / schreibweise erlaubt?

Beitrag von franzf »

Bis auf den Fakt, dass eine "Lib" nichts erben kann - ja.
Du hast eine DLL, die dir über eine Factory-Methode (Methode mit festem Namen, die von einem LibLoader geladen werden kann -> extern "C" deklariert") eine Factory-Klasse für Commands liefert.
Ob du hierfür die Qt-Infrastruktur für Plugins verwendest (vorsicht: QPluginLoader::instance() ist IMMER die selbe Instanz!) oder selber via QLibrary sollte wurscht sein.
Du hast dann halt pro dll zwei Klassen - die CommandFactory und das eigentliche Command.

Und bevor du das jetzt gleich in dein eh schon dickes (?) Projekt einflickst, solltest du das im Kleinen an einem primitiven Test ausprobieren ;)
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: pointer / schreibweise erlaubt?

Beitrag von DBGTMaster »

franzf hat geschrieben:Bis auf den Fakt, dass eine "Lib" nichts erben kann - ja.
Du hast eine DLL, die dir über eine Factory-Methode (Methode mit festem Namen, die von einem LibLoader geladen werden kann -> extern "C" deklariert") eine Factory-Klasse für Commands liefert.
Ob du hierfür die Qt-Infrastruktur für Plugins verwendest (vorsicht: QPluginLoader::instance() ist IMMER die selbe Instanz!) oder selber via QLibrary sollte wurscht sein.
Du hast dann halt pro dll zwei Klassen - die CommandFactory und das eigentliche Command.

Und bevor du das jetzt gleich in dein eh schon dickes (?) Projekt einflickst, solltest du das im Kleinen an einem primitiven Test ausprobieren ;)
Gibt es für das ganze vielleicht auch noch eine Doku oder ähnliches, wo mein Problem oder ein ähnliches Problem beschrieben ist??

lG
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: pointer / schreibweise erlaubt?

Beitrag von franzf »

Im Prinzip ist doch alles gesagt:

Deine Interfaces:

Code: Alles auswählen

struct CommandInterface {
    virtual ~CommandInterface() {}
    virtual void runCommand() =0; // o.Ä.
};

struct CommandInterfaceFactory {
    virtual ~CommandInterfaceFactory() {}
    virtual CommandInterface* createCommand() const =0;
};
Die Plugin-Klassen:
Header

Code: Alles auswählen

struct Command1 : CommandInterace {
    //7 Member go here
};

struct Command1Factory : CommandInterfaceFactory {
    // Member go here
};
Die .cpp:

Code: Alles auswählen

// Command1::runCommand-impl

Command1*
Command1Factory::createCommand() const {
    return new Command1;
}

extern "C" {
  CommandInterfaceFactory* createFactory() {
      return new Command1Factory;
  }
}
Das .cpp in ne dll kompilieren.
Die QLibrary-Doku sagt die, wie du an "createFactory" kommst. Diese "createFactory" ist die Methode, mit der du die jeweilige Factory aus der DLL holst. Diese Factory packst du in die map<string, factory>, welche die eigentlichen Commands erzeugt.
Parameter für den Command-Konstruktor und runCommand() hab ich der Einfachheit halber weggelassen.
Antworten