Frage zu klasse
-
Hallo,
wieso geht das nicht ?
#include <iostream> using namespace std; static class math{ public: int cosinus(int x){ return x; } int sinus(int x){ return x; } }; int main() { math.sinus(4); }
-
Weil math eine Klasse ist. Meintest du
namespace math { int sinus(int x) { return x; } } int main() { math::sinus(4); }?
-
Google: c++ Singletone Pattern
Namespaces sind für dein Vorhaben wohl besser geeignet.
-
blurry333 schrieb:
wieso geht das nicht
Versuch bitte beim nächsten mal einen aussagekräftigen Titel zu finden. Zudem wird dir dein Compiler sicherlich eine Fehlermeldung angegeben haben.
Grundsätzlich gibt es in Ansi C++ gibt es kein "static class", wenn musst du die einzelnen Methoden static deklarieren. Meines Erachtens macht eine static class fast ausschließlich in Sprachen Sinn, in denen man gezwungen wird, alles in eine Klasse zu schreiben.
-
in C sharp gibt es doch auch die klasse math.
dort geht ja auch math.sinus() ;
das gleiche will ich halt in C++ machen
-
Ja, dann...
asc schrieb:
Grundsätzlich gibt es in Ansi C++ gibt es kein "static class", wenn musst du die einzelnen Methoden static deklarieren.
-
#include <iostream> using namespace std; struct M { int Cosinus(int x) { return x; } int Sinus(int x) { return x; } }; static M Math; int main() { std::cout << Math.Sinus(4) << std::endl; return 0; }Und was bringt dir das?
Nichts. Jede Sprache verfolgt ein anderes Sprachkonzept und was in C# Sinn macht, das muss nicht zwangsläufig in C++ auch Sinn machen.
-
so gehts
#include <iostream> using namespace std; class math{ public: static int cosinus(int x){ return x; } static int sinus(int x){ return x; } }; int main() { cout<<math::cosinus(4); }
-
In Sprachen wie C# und Java ist man dazu gezwungen alle Funktionen als Methoden (also innerhalb von Klassen) zu implemetieren. C++ ist mächtiger, weil man da nicht zwangsläufig Klassen braucht, was Sinn macht, da manche Funktionen einfach keiner Klasse zugeordnet werden müssen.
Statische Klassen in C++ sind also sinnlos, dafür nutzt man einfach freie Funktionen und gut ist. Wenn man Kapselung ermöglichen möchte, kann man z.B. anonyme namespaces verwenden. Im eigentlich Sinne ist eine Klasse aber dafür gedacht, daraus Objekte zu basteln. Statische Klassen widersprechen daher meines Erachtens der Grundidee. Dass das in C# und Java keinen interessiert, ist ja eine andere Sache.
-
so gehts
Nö in C# wird mit dem Punktoperator zugegriffen. Bei deiner Variante kannst du auch gleich einen Namespace nehmen.
-
Wozu eine Klasse, wenn alle Methoden darin static sind? Ersetze
classdurchnamespaceund du hast die C++ Lösung, die übrigens Seldon auch schon vorgeschlagen hat.
-
ich find das gar nicht sinnlos.
Ich möchte alle mathematischen Funktionen in einer Klasse bündeln.
Das Intelisense zeigt mir dann auch gleich an welche funktionen es gibt.
So gesehen find ich statische methoden sehr gutund ok namespace ist noch besser weil man dann nicht immer static schreiben muss

-
blurry333 schrieb:
ich find das gar nicht sinnlos.
Ich möchte alle mathematischen Funktionen in einer Klasse bündeln.
Das Intelisense zeigt mir dann auch gleich an welche funktionen es gibt.
So gesehen find ich statische methoden sehr gutIntellisense funktioniert auch mit namespaces. Darum ist die Klasse sinnlos.
Mal ganz davon abgesehen, dass es Funktionen für sinus und cosinus schon in cmath gibt.
-
blurry333 schrieb:
Ich möchte alle mathematischen Funktionen in einer Klasse bündeln.
Eine Klasse bringt für dieses Beispiel nichts. Sie verwirrt nur, weil man sie instanziieren oder von ihr ableiten kann. Was hier aber keinen Sinn macht.
Nimm einen Namensraum.
-
Grundsätzlich sind in C++ Klassen nicht zum Bündeln von Funktionen da. Klassen sollen Attribute kapseln und die Zugriffsmethoden dienen nur dazu, diese in angemessener Form zu manipulieren oder auszulesen.
Da "Mathematik" keine Attribute hat (PI wäre eine statische Konstante, das zählt also auch nicht), gehört das eben nicht als Klasse.
-
Eisflamme schrieb:
Da "Mathematik" keine Attribute hat (PI wäre eine statische Konstante, das zählt also auch nicht), gehört das eben nicht als Klasse.
Wäre doch gar nicht mal so unhübsch, eine Zahlenklasse zu haben. Dann würde man schreiben 90.sin() oder 5.plus(3)
. Das wäre immerhin konsequent objektorientiert, das sollte man auf jeden Fall in Java einbauen und verpflichtend machen.
-
Das ist ja was andres, aber ja, das wäre zur Abwechslung Mal ein hübscher Nebeneffekt des OOP-Fanatismus.
