Alles in Klassen stecken?



  • http://www.ddj.com/cpp/184401197 schrieb:

    else if (f needs type conversions
    on its left-most argument)
    {

    Was soll das sein?
    Kann mal einen Beispielcode für f needs type conversions on its left-most argument schreiben?



  • Also als inzwischen auch Java-Programmierer bin ich da eben ein wenig komisch.
    Wenn ich eine Methode habe, bei der es egal ist, ob sie in eine bestimmte Klasse kommt oder nicht, werde ich sie auch nicht unbedingt in diese schreiben. Das heißt aber nicht, dass sie nicht anderswo sinnvoll in einer anderen Klasse aufgehoben sein kann.

    Klassen beschreiben Objekte und sämtliche Methoden, die mit diesen Objekten direkt zu tun haben, also Inhalte auslesen/setzen und streckenweise auswerten gehören dann dazu.

    Ist so ungefähr wie das Problem mit den Löwen.. Die sollten imo zwar keine Methode mitbringen, sich fangen zu lassen, aber brüllen sollten sie schon selber. Das Einfangen wäre bei mir dann eher eine Frage des Käfigs..



  • DocJunioR schrieb:

    tntnet schrieb:

    Eine Funktion in eine Klasse zu packen, nur weil es geht, macht das Programm nicht besser.

    ´

    und schneller auch nicht ^^
    aber es ist einfacher, wenn man es nur mit oop oder nur mit strukturierter programmierung (hat das ne abk.?) zu tun hat..

    Ich muss regelmäßig den Salat anderer Leute aufräumen.. da freut man sich darüber, wenn mal einer nen bisken konsequent ist.

    Mit Schelligkeit hat das gar nichts zu tun. Binär ist das kein Unterschied, ob eine Funktion frei steht oder als statische Member definiert ist.

    Konsequent heißt für mich nicht zwangsweise alles objektorientiert. Auch wenn es wiedersprüchlich klingen mag, kann konsequent durchaus bedeuten, daß ich sowohl Objekte als auch frei stehende Funktionen habe. Die STL hat (mehr oder weniger) konsequent Container als Klassen und die algorithmen als frei stehende Funktionen. Ob das nun Oop ist oder nicht, ist mir so ziemlich egal. Hauptsache es ist gut strukturiert, verständlich und performant.

    Übrigens: zählst Du Oop nicht zur strukturierten Programmierung 😕 ? Dann wäre Oop ja unstrukturiert 😃 .



  • kann man sich auch in C objektorientierten Code schreiben

    Das ist einfach eine Behauptung, die falsch ist.
    Das Gefrickel mit structs ist eine Möglichkeit Klassen nachzumodelieren.
    Objektorientierung umfasst aber eine Menge mehr.



  • Was denn? Polymorphie und Vererbung bekommt man auch hin.



  • richtigstellung schrieb:

    kann man sich auch in C objektorientierten Code schreiben

    Das ist einfach eine Behauptung, die falsch ist.
    Das Gefrickel mit structs ist eine Möglichkeit Klassen nachzumodelieren.
    Objektorientierung umfasst aber eine Menge mehr.

    Aha, was denn, was man Deiner Meinung nach mit C nicht hinbekommt? Da bin ich ja mal gespannt!



  • tntnet schrieb:

    Übrigens: zählst Du Oop nicht zur strukturierten Programmierung 😕 ? Dann wäre Oop ja unstrukturiert 😃 .

    ich sag ja, ich muss nen kommunikationskurs machen..
    oop ist eher nen aufsatz auf die strukturierte programmierung, ums noch ordentlicher und für laien noch verwirrender zu machen ^^



  • richtigstellung schrieb:

    kann man sich auch in C objektorientierten Code schreiben

    Das ist einfach eine Behauptung, die falsch ist.
    Das Gefrickel mit structs ist eine Möglichkeit Klassen nachzumodelieren.
    Objektorientierung umfasst aber eine Menge mehr.

    jetzt sag aber nicht, dass structs noch funktionen enthalten sollten.
    🙂



  • was ist das schrieb:

    http://www.ddj.com/cpp/184401197 schrieb:

    else if (f needs type conversions
    on its left-most argument)
    {

    Was soll das sein?
    Kann mal einen Beispielcode für f needs type conversions on its left-most argument schreiben?

    Wir schreiben einfach mal eine Klasse für komplexe Zahlen (ja, die gibt es schon in der Standardbibliothek, aber ein besseres Beispiel fällt mir gerade nicht ein):

    class Complex
    {
        public:
            Complex(double real, double imaginary = 0.0) //erlaubt Konvertierung von einfachen doubles zu Komplexen Zahlen
                 : re(real), im(imaginary)
            {}
            Complex& operator+=(Complex const& rhs)
            {
                re += rhs.re;
                im += rhs.im;
                return *this;
            }
            //erste Möglichkeit zur Implementierung der (normalen) Addition
            Complex operator+(Complex const& rhs) const
            {
                 Complex result = *this;
                 result += rhs;
                 return result;
            }
        private:
            double re, im;
    };
    

    Wenn man jetzt diesen Code kompilieren will:

    int main()
    {
        Complex a(1.0,1.0), b(2.0,3.0);
        Complex c = a + b;
        Complex d = a + 1.0;
        Complex e = 1.0 + a;
    }
    

    Kriegt man folgenden Fehler

    error: no operator "+" matches these operands
           operand types are: double + Complex
          Complex e = 1.0 + a;
    

    Das liegt daran, dass man keine Standardkonvertierungen benutzen und dann auf das Resultat eine Methode anwenden kann. Schreibt man die Addition jetzt aber so:

    class Complex
    {
        public:
            Complex(double real, double imaginary = 0.0) //erlaubt Konvertierung von einfachen doubles zu Komplexen Zahlen
                 : re(real), im(imaginary)
            {}
            Complex& operator+=(Complex const& rhs)
            {
                re += rhs.re;
                im += rhs.im;
                return *this;
            }
        private:
            double re, im;
    };
    
    //Zweite Möglichkeit zur Implementierung der (einfachen) Addition
    Complex operator+(Complex const& lhs, Complex const& rhs)
    {
        Complex result = lhs;
        result += rhs;
        return result;
    }
    

    dann funktioniert der obige Code, weil man mit Standardkonvertierungen den double zu einem Complex umwandeln und das Resultat an eine const-Referenz binden kann. Weil man eben gerne diese Symmetrie hat, das sowohl double+Complex, als auch Complex+double funktionieren, ist es besser solche Operatoren, bei denen man für das linke Argument Konvertierungen erlauben will als (globale) non-member Funktionen zu schreiben.

    Felix



  • Walli schrieb:

    richtigstellung schrieb:

    kann man sich auch in C objektorientierten Code schreiben

    Das ist einfach eine Behauptung, die falsch ist.
    Das Gefrickel mit structs ist eine Möglichkeit Klassen nachzumodelieren.
    Objektorientierung umfasst aber eine Menge mehr.

    Aha, was denn, was man Deiner Meinung nach mit C nicht hinbekommt? Da bin ich ja mal gespannt!

    Das ist mit der Zeit richtig nervig Leute mal zum lesen zu animieren.
    🙄
    http://de.wikipedia.org/wiki/Objektorientierung



  • Richtigsteller schrieb:

    Walli schrieb:

    richtigstellung schrieb:

    kann man sich auch in C objektorientierten Code schreiben

    Das ist einfach eine Behauptung, die falsch ist.
    Das Gefrickel mit structs ist eine Möglichkeit Klassen nachzumodelieren.
    Objektorientierung umfasst aber eine Menge mehr.

    Aha, was denn, was man Deiner Meinung nach mit C nicht hinbekommt? Da bin ich ja mal gespannt!

    Das ist mit der Zeit richtig nervig Leute mal zum lesen zu animieren.
    🙄
    http://de.wikipedia.org/wiki/Objektorientierung

    ich glaube nicht, dass er damit meinte, das C polymorphie, vererbung und krams unterstützt. er meinte, dass man jeden algorithmus den man in c++ implementieren kann auch in C implementieren kann und jedes problem welches man mit C++ lösen kann, man auch mit C lösen kann und man auch mit C durchaus ansatzweise objektorientiert programmieren kann, wie es auch mit assembler funktioniert 😉



  • Richtigsteller schrieb:

    Das ist mit der Zeit richtig nervig Leute mal zum lesen zu animieren.
    🙄
    http://de.wikipedia.org/wiki/Objektorientierung

    Viel nerviger ist es die Leute zum verstehen zu animieren.



  • Man kriegt auch alles in Assembler umgesetzt. Fragt sich nur, mit welchem Aufwand? Welche Wartungsfreundlichkeit? Selbst mit Lohckkarten wird man sicherlich alles umsetzen können. Aber ich nimm halt doch lieber Tastatur und Bildschirm. Genauso wie ich lieber C++ anstatt C nehme. 😉



  • BarnieGeroellheimer schrieb:

    Man kriegt auch alles in Assembler umgesetzt. Fragt sich nur, mit welchem Aufwand? Welche Wartungsfreundlichkeit? Selbst mit Lohckkarten wird man sicherlich alles umsetzen können. Aber ich nimm halt doch lieber Tastatur und Bildschirm. Genauso wie ich lieber C++ anstatt C nehme. 😉

    um aufwand ging es ja jetzt nicht 🙂



  • Wie bekommt man in C Datenkapselung hin, außer nen Kommentar, //auf x nur mit foo() zugreifen, zu schreiben?



  • Im öffentlichen Teil:

    typedef struct Object* ObjectHandle;
    

    Im privaten Teil:

    struct Object
    {
        /* ... */
    };
    

    Funktionen arbeiten mit einem ObjectHandle. Von außen kann nicht auf die internen Member von Object zugegriffen werden.



  • BarnieGeroellheimer schrieb:

    Genauso wie ich lieber C++ anstatt C nehme.

    vom regen in die traufe, oder wie meinst du das?
    🙂


Anmelden zum Antworten