Funktionen für mehere classen
Funktionen für mehere classen
Hi,
angenommen, ich habe eine funktione, die z.B. so aussieht:
double quadrat_flaeche(double seite)
{
return seite * seite;
}
Gut, nun brauche ich diese Funktion in meheren (C++) Klassen... unter anderen (z.B.) in:
class geometrie{/*...*/};
class architektur{/*...*/};
So, es soll nun möglich sein in einer funktion der classe geametrie quadrat_flaeche() aufzurufen, auch aus der classe architektur. Des weiteren soll der Code von quadrat_flaeche natürlich nur _ein_ mal existieren (also nicht in jeder classe die sie brauch sein)
Wie ist obiger fall zu lösen ?
Peter
angenommen, ich habe eine funktione, die z.B. so aussieht:
double quadrat_flaeche(double seite)
{
return seite * seite;
}
Gut, nun brauche ich diese Funktion in meheren (C++) Klassen... unter anderen (z.B.) in:
class geometrie{/*...*/};
class architektur{/*...*/};
So, es soll nun möglich sein in einer funktion der classe geametrie quadrat_flaeche() aufzurufen, auch aus der classe architektur. Des weiteren soll der Code von quadrat_flaeche natürlich nur _ein_ mal existieren (also nicht in jeder classe die sie brauch sein)
Wie ist obiger fall zu lösen ?
Peter
Re: Funktionen für mehere classen
Hi!
Vielleicht verstehe ich ja das Problem nicht, aber was spricht gegen die Verwendung von Vererbung?
Cheers,
GNU/Wolfgang
Vielleicht verstehe ich ja das Problem nicht, aber was spricht gegen die Verwendung von Vererbung?
Cheers,
GNU/Wolfgang
Re: Funktionen für mehere classen
Du nimmst eine Basisklasse, in der du deine Quadratfunktion implementierst, bspw. quadratmath
du schreibst also
class QuadratMath
{
public:
double quadrat_flaeche(double seite)
{
return seite * seite;
}
};
so und dann:
class geometrie:public QuadratMath
{
}
und
class architektur:public QuadratMath
{
}
PS:
Die Namen von den Klassen würde ich Großschreiben, die Namen der Instanzvariablen aber klein.
du schreibst also
class QuadratMath
{
public:
double quadrat_flaeche(double seite)
{
return seite * seite;
}
};
so und dann:
class geometrie:public QuadratMath
{
}
und
class architektur:public QuadratMath
{
}
PS:
Die Namen von den Klassen würde ich Großschreiben, die Namen der Instanzvariablen aber klein.
Re: Funktionen für mehere classen
Ich bin mir nicht ganz sicher, ob vererbung das richtige ist...
Da hab ich einfach so ein paar funktionen, die ich immer wieder brauche, und die ich nützlich finde. Am Besten fände ich es, wenn man einfach per #include "meineutils.h" die Funktionen zur verfügung hätte... Am Besten ohne Makefile umschreiben So wie das halt auch mit den mitgelieferten Funktionen wie pow() oder printf() geht....
Peter
Da hab ich einfach so ein paar funktionen, die ich immer wieder brauche, und die ich nützlich finde. Am Besten fände ich es, wenn man einfach per #include "meineutils.h" die Funktionen zur verfügung hätte... Am Besten ohne Makefile umschreiben So wie das halt auch mit den mitgelieferten Funktionen wie pow() oder printf() geht....
Peter
Re: Funktionen für mehere classen
schreib dir eine klasse und deklarier die methoden darin als public static
Re: Funktionen für mehere classen
static halte ich auch für diesen Fall als die beste Lösung. Das bläht die Klasse nicht unnötig auf.
Würde es dann aber als protected schützen.
<pre>
protected:
static double quadrat_flaeche (double seite);
</pre>
Würde es dann aber als protected schützen.
<pre>
protected:
static double quadrat_flaeche (double seite);
</pre>
Re: Funktionen für mehere classen
Hi!
Ich bin zwar kein C++ Guru (und will auch sicherlich keiner sein), aber wäre dafür nicht ein Namensraum (namespace) besser geeignet? Wenn es unbedingt in den Klassen sein soll, könnte man natürlich auch Mehrfachvererbung verwenden, denn diese wird ja AFAIK in C++ unterstützt.
Cheers,
GNU/Wolfgang
Ich bin zwar kein C++ Guru (und will auch sicherlich keiner sein), aber wäre dafür nicht ein Namensraum (namespace) besser geeignet? Wenn es unbedingt in den Klassen sein soll, könnte man natürlich auch Mehrfachvererbung verwenden, denn diese wird ja AFAIK in C++ unterstützt.
Cheers,
GNU/Wolfgang
Re: Funktionen für mehere classen
Hi Wolfgang
Richtig. Aus OO-Designsicht würde man das als Utility-Klasse bezeichnen und in C++ in einen namespace packen.
Im statischen Strukturdiagramm bei UML gibt es dafür sogar eine Klasse mit dem Stereotype "utility", die man dann so implementieren würde.
<pre>
namespace utility
{
static void blabla ();
}
</pre>
unter C# würde das so aussehen:
<pre>
public class utility
{
public static void blabla();
}
</pre>
Aber um OO-Design ging es ja hier nicht sondern nur um C++ <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Richtig. Aus OO-Designsicht würde man das als Utility-Klasse bezeichnen und in C++ in einen namespace packen.
Im statischen Strukturdiagramm bei UML gibt es dafür sogar eine Klasse mit dem Stereotype "utility", die man dann so implementieren würde.
<pre>
namespace utility
{
static void blabla ();
}
</pre>
unter C# würde das so aussehen:
<pre>
public class utility
{
public static void blabla();
}
</pre>
Aber um OO-Design ging es ja hier nicht sondern nur um C++ <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Last edited by arni on 13. Feb 2002 22:23, edited 1 time in total.
Re: Funktionen für mehere classen
Fuktionen gehen static (me verwendet das nur bei variablen)... Was ist bei static funktionen besonders ??
protected ? meint ihr vielleicht private ?? Wenn nicht, was bewirkt das protected ?
Peter <-- merkt grad das er schon seit nem Jahr mit C++ programmiert, und doch keine Ahnung hat
protected ? meint ihr vielleicht private ?? Wenn nicht, was bewirkt das protected ?
Peter <-- merkt grad das er schon seit nem Jahr mit C++ programmiert, und doch keine Ahnung hat
Re: Funktionen für mehere classen
Innerhalb einer Klasse ist eine statische Methode fast wie eine normale globale Funktion. Die Methode hat keinen Eintrag im vtable der Klasse (kann damit auch von jeder C-API aufgerufen werden bzw. als Callback-Funktion benutzt werden!!) und der Code wird nicht an abgeleitete Klassen vererbt. Zudem hat die Methode keine Zugriff auf Attribute oder andere nicht-statische Methoden der Klasse! ( Man kann so eine Methode deswegen auch über Class::foo () aufrufen)
Aber die Zugriffsrechte wie "protected, private, public" haben weiterhin Gültigkeit <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Eine (globale) statische Funktion ist suzusagen "pivat" in diesem Module. Sie nur in diesem Module sichtbar.
(In einer Bibliothek wird so eine statische Funktion auch nicht in der "exportabelle" stehen (wozu auch? die Funktion gibt es ja nur
in diesem Modul)
public : öffentlich, überall sichtbar
proteced: geschützt, nur in der Klasse und davon abgeleiteten Klassen sichtbar
private: nur in der Klasse selbst sichtbar
Aber die Zugriffsrechte wie "protected, private, public" haben weiterhin Gültigkeit <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Eine (globale) statische Funktion ist suzusagen "pivat" in diesem Module. Sie nur in diesem Module sichtbar.
(In einer Bibliothek wird so eine statische Funktion auch nicht in der "exportabelle" stehen (wozu auch? die Funktion gibt es ja nur
in diesem Modul)
public : öffentlich, überall sichtbar
proteced: geschützt, nur in der Klasse und davon abgeleiteten Klassen sichtbar
private: nur in der Klasse selbst sichtbar
Re: Funktionen für mehere classen
Hi!
> Aber um OO-Design ging es ja hier nicht sondern nur um C++
Stimmt. Und beides vernünftig zu kombinieren ist auch kaum möglich. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Cheers,
GNU/Wolfgang
> Aber um OO-Design ging es ja hier nicht sondern nur um C++
Stimmt. Und beides vernünftig zu kombinieren ist auch kaum möglich. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Cheers,
GNU/Wolfgang