 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Carsten Schaudel Guest
|
Posted: Fri Mar 03, 2006 9:06 pm Post subject: wie realisiere ich einen pointer der dynamisch auf verschied |
|
|
Hallo zusammen,
ich suche eine Lösung ( oder auch einfach ein Stichwort) für die Lösung
folgenden problemes:
Ich habe eine VC++ Anwendung, die je nach angeschlossenen Gerät über
verschiedene Adapterklassen auf diese HW zugreifen soll.
Ich würde das gerne folgendermaßen realisieren:
Ich erstelle für jede variante eine zugriffsklasse. Hierbei haben alle
methoden die selben namen, parameter und rückgabewert.
Jetzt würde ich von der eigendlichen Anwendung aus gerne dymanisch
entscheiden welche dieser klassen ich den benutzen muss, möchte das aber nur
bei der Instanziirung berücksichtigen müssen und den Namen der instanz dann
immer gleich lassen.
Ungefähr so:
void handler(Kuchenart)
{
switch (Kuchenart)
{
case streusel:
baecker = new Streuselklasse
break;
case kaese:
baecker = new Streuselklasse
break;
case marmor:
baecker = new Streuselklasse
break;
}
baecker .backen();
.....
}
class Streuselklasse
{
public:
int backen()
{
ergänze streusel();
tue in ofen();
heize ofen (180);
}
}
class marmorklasse
{
public:
int backen()
{
tue in ofen();
heize ofen (160);
}
}
class kaeseklasse
{
public:
int backen()
{
tue in ofen();
heize ofen (170);
}
}
ich denke jetzt ist klar was ich will.
Nur wie realisiere ich das am geschicktesten ?
Gruß
Carsten
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Fri Mar 03, 2006 10:06 pm Post subject: Re: wie realisiere ich einen pointer der dynamisch auf versc |
|
|
Carsten Schaudel wrote:
| Quote: | Hallo zusammen,
ich suche eine Lösung ( oder auch einfach ein Stichwort) für die Lösung
folgenden problemes:
Ich habe eine VC++ Anwendung, die je nach angeschlossenen Gerät über
verschiedene Adapterklassen auf diese HW zugreifen soll.
Ich würde das gerne folgendermaßen realisieren:
Ich erstelle für jede variante eine zugriffsklasse. Hierbei haben alle
methoden die selben namen, parameter und rückgabewert.
Jetzt würde ich von der eigendlichen Anwendung aus gerne dymanisch
entscheiden welche dieser klassen ich den benutzen muss, möchte das aber
nur bei der Instanziirung berücksichtigen müssen und den Namen der
instanz dann immer gleich lassen.
|
Das nennt sich Polymorphie und ist ein sehr grundlegendes Konzept in C++.
Wenn du kein brachbares Buch über C++ hast, empfehle ich dir, dir eins
zuzulegen.
| Quote: | Ungefähr so:
void handler(Kuchenart)
{
switch (Kuchenart)
{
case streusel:
baecker = new Streuselklasse
break;
case kaese:
baecker = new Streuselklasse
break;
case marmor:
baecker = new Streuselklasse
break;
}
baecker .backen();
....
}
class Streuselklasse
{
public:
int backen()
{
ergänze streusel();
tue in ofen();
heize ofen (180);
}
}
class marmorklasse
{
public:
int backen()
{
tue in ofen();
heize ofen (160);
}
}
class kaeseklasse
{
public:
int backen()
{
tue in ofen();
heize ofen (170);
}
}
ich denke jetzt ist klar was ich will.
Nur wie realisiere ich das am geschicktesten ?
|
class Kuchenklasse
{
public:
virtual int backen() = 0;
virtual ~Kuchenklasse() {}
};
class Streuselklasse : public Kuchenklasse
{
public:
int backen()
{
ergänze streusel();
tue in ofen();
heize ofen (180);
}
};
class marmorklasse : public Kuchenklasse
{
public:
int backen()
{
tue in ofen();
heize ofen (160);
}
};
class kaeseklasse : public Kuchenklasse
{
public:
int backen()
{
tue in ofen();
heize ofen (170);
}
};
void handler(Kuchenart art)
{
Kuchenklasse* baecker;
switch (art)
{
case streusel:
baecker = new Streuselklasse;
break;
case kaese:
baecker = new kaeseklasse;
break;
case marmor:
baecker = new marmorklasse;
break;
}
baecker->backen();
delete baecker;
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Heinz Ozwirk Guest
|
Posted: Fri Mar 03, 2006 11:06 pm Post subject: Re: wie realisiere ich einen pointer der dynamisch auf versc |
|
|
"Carsten Schaudel" <carsten (AT) schaudel (DOT) de> schrieb im Newsbeitrag
news:46rk7eFckopiU1 (AT) individual (DOT) net...
| Quote: | Hallo zusammen,
ich suche eine Lösung ( oder auch einfach ein Stichwort) für die Lösung
folgenden problemes:
Ich habe eine VC++ Anwendung, die je nach angeschlossenen Gerät über
verschiedene Adapterklassen auf diese HW zugreifen soll.
Ich würde das gerne folgendermaßen realisieren:
Ich erstelle für jede variante eine zugriffsklasse. Hierbei haben alle
methoden die selben namen, parameter und rückgabewert.
Jetzt würde ich von der eigendlichen Anwendung aus gerne dymanisch
entscheiden welche dieser klassen ich den benutzen muss, möchte das aber
nur bei der Instanziirung berücksichtigen müssen und den Namen der instanz
dann immer gleich lassen.
Ungefähr so:
void handler(Kuchenart)
{
switch (Kuchenart)
{
case streusel:
baecker = new Streuselklasse
break;
case kaese:
baecker = new Streuselklasse
break;
case marmor:
baecker = new Streuselklasse
break;
}
baecker .backen();
....
}
class Streuselklasse
{
public:
int backen()
{
ergänze streusel();
tue in ofen();
heize ofen (180);
}
}
class marmorklasse
{
public:
int backen()
{
tue in ofen();
heize ofen (160);
}
}
class kaeseklasse
{
public:
int backen()
{
tue in ofen();
heize ofen (170);
}
}
ich denke jetzt ist klar was ich will.
Nur wie realisiere ich das am geschicktesten ?
|
Du wolltest ein Stichwort? hier sind gleich zwei: Vererbung, Polimophismus.
Da alles Wurst, äh, natürlich Kuchen ist, bietet sich eine Basisklasse
Kuchen an, die alle Funktionen zum Kuchenbacken beschreibt, und von der alle
anderen Klassen erben, also
class Kuchen
{
public:
virtual ~Kuchen();
virtual int Backen() = 0;
virtual void TueInOfen();
virtual void HeizeOfen(int temperatur);
...
};
Die Funktionen, die voraussichtlich für alle Kuchen gleich sind, können in
der Basisklasse implementiert werden. Die anderen Funktionen, die für alle
Kuchen unterschiedlich implementiert werden müssen, werden zwar in der
Basisklasse definiert, aber "=0" sagt, dass jeder Kuchen sich selbst darum
kümmern muss.
void Kuchen::HeizeOfen(int temperatur)
{
// Stelle Temeratur ein.
}
void Kuchen::TueInOfen()
{
// ...
}
Die einzelnen Kuchen-Klassen werden dann einfach abgeleitet:
class Streuselkuchen: public Kuchen
{
public:
int Backen();
};
int Streuselkuchen::Backen()
{
// ...
}
Die Instanzen der verschiedenen Kuchen können dann erzeugt werden, wie du es
schon gemacht hast. Die Adresse einer Instanz kann dann vom Typ Kuchen*
sein.
Einiges scheint aber an deinem Design nicht zu stimmen. Ich vermisse einen
Ofen. Wenn man den hat, dann kann man der Funktion TueInOfen als Parameter
mitgeben, in welchen Ofen. Oder gehst du von einer normalen Küche aus, in
der es nur einen globalen Ofen gibt? Jeder ordentlich Bäcker hat inzwischen
mehrere Ofen zur Verfügung. Man denke nur an die Brözchen-Öfen, die
inzwischen in jeder Supermarkt-Filiale stehen. Auch das Heizen des Ofens
macht normalerweise nicht der Kuchen, sondern der Bäcker, der irgendeinen
Knopf am Ofen dreht (oder eine Funktion mit dem entsprechenden Parameter
aufruft).
Am meisten stört mich aber, dass du die Variable, in der die Adresse der
Kuchen-Objekte gespeichert werden soll, ausgerechnet baecker heißen soll.
Findest du nicht, dass
Kuchen* baecker;
irgendwie seltsam aussieht. Vielleicht hältst du es mit den Namen ja auch
wie Goethe, von wegen Schall und Rauch. Aber es geht dann irgendwie mit
"vernebelt" weiter, und das wird ein Programm durch schlecht gewählte Namen.
HTH
Heinz
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Raymond Haeb Guest
|
Posted: Fri Mar 03, 2006 11:06 pm Post subject: Re: wie realisiere ich einen pointer der dynamisch auf versc |
|
|
Rolf Magnus <ramagnus@t-online.de>:
| Quote: | void handler(Kuchenart art)
{
Kuchenklasse* baecker;
|
Kuchenklasse* baecker = 0;
| Quote: | switch (art)
{
case streusel:
baecker = new Streuselklasse;
break;
case kaese:
baecker = new kaeseklasse;
break;
case marmor:
baecker = new marmorklasse;
break;
}
|
if(baecker)
baecker->backen();
delete baecker;
| Quote: | baecker->backen();
delete baecker;
}
|
Nur der Vollständigkeit halber :-)
Raymond
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Carsten Schaudel Guest
|
Posted: Sat Mar 04, 2006 4:00 am Post subject: Re: wie realisiere ich einen pointer der dynamisch auf versc |
|
|
Hallo !
Vielen Dank für die Antworten - jetzt weiss ich wie ich weiter komme.
.... und seit nicht zu hart zu mir - was Programmierung angeht komme ich
eher von der Embedded /SPS Seite - da ist mir '++' halt eher noch nix - aber
ich bin ja lernfähig ...
Gruß
Carsten
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Sun Mar 05, 2006 1:06 pm Post subject: Re: wie realisiere ich einen pointer der dynamisch auf versc |
|
|
Carsten Schaudel wrote:
| Quote: | Hallo !
Vielen Dank für die Antworten - jetzt weiss ich wie ich weiter komme.
... und seit nicht zu hart zu mir - was Programmierung angeht komme ich
eher von der Embedded /SPS Seite - da ist mir '++' halt eher noch nix -
|
Echt? Ich habe schon einen 8-Bit-Mikrocontroller mit 1kB Programmspeicher
und 64 Bytes RAM in C++ programmiert.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sun Mar 05, 2006 2:06 pm Post subject: Re: wie realisiere ich einen pointer der dynamisch auf versc |
|
|
Rolf Magnus wrote:
| Quote: | Carsten Schaudel wrote:
Vielen Dank f?r die Antworten - jetzt weiss ich wie ich weiter komme.
... und seit nicht zu hart zu mir - was Programmierung angeht komme ich
eher von der Embedded /SPS Seite - da ist mir '++' halt eher noch nix -
Echt? Ich habe schon einen 8-Bit-Mikrocontroller mit 1kB Programmspeicher
und 64 Bytes RAM in C++ programmiert.
|
--verbose
Ich bin zwar auch davon überzeugt, dass das theoretisch möglich ist,
aber wo wird das praktisch umgesetzt? Der von mir in C++ beackerte uC
ist schon ein paar Nümmerchen größer.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Martin Kaul Guest
|
Posted: Mon Mar 06, 2006 6:06 am Post subject: Re: wie realisiere ich einen pointer der dynamisch auf versc |
|
|
Stefan Reuther wrote:
| Quote: | Rolf Magnus wrote:
Ich bin zwar auch davon überzeugt, dass das theoretisch möglich ist,
aber wo wird das praktisch umgesetzt? Der von mir in C++ beackerte uC
ist schon ein paar Nümmerchen größer.
Ich melde mich schon mal - C++ in embedded Applikationen wird bei mir |
immer mehr - Codegröße ist nicht alles.
Ausserdem kommt es darauf an - durch C++ mit OO (also nicht nur C mit
Klassen) ändert sich IMHO die Struktur der Software, was einen Code auch
kleiner machen kann. Z.B. kann man durch Polymorphie eigentlich auf die
meisten switch-cases Anweisungen verzichten.
tschaule
Martin
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Mon Mar 06, 2006 11:06 am Post subject: Re: wie realisiere ich einen pointer der dynamisch auf versc |
|
|
Stefan Reuther wrote:
| Quote: | Rolf Magnus wrote:
Carsten Schaudel wrote:
Vielen Dank f?r die Antworten - jetzt weiss ich wie ich weiter komme.
... und seit nicht zu hart zu mir - was Programmierung angeht komme ich
eher von der Embedded /SPS Seite - da ist mir '++' halt eher noch nix -
Echt? Ich habe schon einen 8-Bit-Mikrocontroller mit 1kB Programmspeicher
und 64 Bytes RAM in C++ programmiert.
--verbose
Ich bin zwar auch davon überzeugt, dass das theoretisch möglich ist,
aber wo wird das praktisch umgesetzt? Der von mir in C++ beackerte uC
ist schon ein paar Nümmerchen größer.
|
Die AVR-Architektur von Atmel. Für den gibt es einen Port von GCC, der auch
den C++—Compiler einschließt. Es gibt natürlich durchaus Einschränkungen.
Es gibt keine C++-Standardbiblitothek (die von C ist aber in großen Teilen
vorhanden) und keine Exceptions.
Polymorphie, Templates und so weiter gibt's aber. Bei Polymorphie gibt's
beim g++ aber leider einen Pferdefuß: Die vtable wird im RAM gespeichert,
was bei so kleinem RAM bitter ist. Prinzipiell bräuchte sie das gar nicht
(und sie steht eh schon im Flash), aber es liegt wohl daran, daß g++ für
solche Architekturen (Harvard) eigentlich nie gedacht war. Auf den
Flash-Speicher muß auf Assembler-Ebene anders zugegriffen werden als auf
RAM.
Bisher habe ich die Polymorphie auf einem uC mit 1k RAM eingesetzt. Aber ich
finde auch schon, daß "C mit Klassen" (und Templates) eine Bereicherung
gegenüber C darstellt, z.B. für eigene Datentypen wie 24bit-Integers oder
Fixkommatypen mit wählbarer Anzahl an Vor- und Nachkommabits. Ein
Smartpointer zum einfachen und typsicheren Zugriff auf Flash oder EEPROM
(in C müßte man jeden Zugriff über spezielle Makros durchführen) ist auch
schön.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Mon Mar 06, 2006 7:06 pm Post subject: Re: wie realisiere ich einen pointer der dynamisch auf versc |
|
|
Rolf Magnus wrote:
| Quote: | Stefan Reuther wrote:
Rolf Magnus wrote:
Echt? Ich habe schon einen 8-Bit-Mikrocontroller mit 1kB Programmspeicher
und 64 Bytes RAM in C++ programmiert.
--verbose
Ich bin zwar auch davon überzeugt, dass das theoretisch möglich ist,
aber wo wird das praktisch umgesetzt? Der von mir in C++ beackerte uC
ist schon ein paar Nümmerchen größer.
Die AVR-Architektur von Atmel. Für den gibt es einen Port von GCC, der auch
den C++—Compiler einschließt. Es gibt natürlich durchaus Einschränkungen.
Es gibt keine C++-Standardbiblitothek (die von C ist aber in großen Teilen
vorhanden) und keine Exceptions.
|
Ok. Danke.
| Quote: | Polymorphie, Templates und so weiter gibt's aber. Bei Polymorphie gibt's
beim g++ aber leider einen Pferdefuß: Die vtable wird im RAM gespeichert,
was bei so kleinem RAM bitter ist. Prinzipiell bräuchte sie das gar nicht
(und sie steht eh schon im Flash), aber es liegt wohl daran, daß g++ für
solche Architekturen (Harvard) eigentlich nie gedacht war. Auf den
Flash-Speicher muß auf Assembler-Ebene anders zugegriffen werden als auf
RAM.
|
Auf "meinem" System ist das Hauptproblem mit Polymorphie, dass die
Konstruktoren zu spät laufen. Ich würde gerne meine Hardwaretreiber als
polymorphe Klassen ausführen, aber leider laufen die Konstruktoren erst
nach der Initialisierung der Hardware. Ansonsten hat die Kiste
glücklicherweise einen flachen Adressraum.
| Quote: | Bisher habe ich die Polymorphie auf einem uC mit 1k RAM eingesetzt. Aber ich
finde auch schon, daß "C mit Klassen" (und Templates) eine Bereicherung
gegenüber C darstellt, z.B. für eigene Datentypen wie 24bit-Integers [...]
|
ACK. Meine C++-Module sind bisher immer von der Quellcode-Größe her halb
so groß gewesen wie die C-Module, die sie ersetzen :)
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|