Unbenannte Klassen



  • unnamed objekte sind nicht standardkornform



  • revediere:

    ich wurde gerade aufgeklärt, daß man meine obige annahme nicht unbenannte klasse nennt (hatte ich mal gelesen, war dann wohl falsch)

    also anders.
    😉



  • elise: Doch das sind schon unbenannte Objekte (auch wenn ich die lieber temporäre Objekte nennen würde), es ging aber um unbenannte Klassen. 🙂
    Wozu man unbenannte Klassen benötigt, weiß ich auch nicht. Aber ich weiß, dass sie in C sehr häufig benutzt wurden und daher auch in C++ nicht fehlen dürften:

    typedef struct { ladida } foobar;
    

    ...
    Für unbenannte Klassen gibt es logischerweise ein paar Einschränkungen, kein Konstruktor und Destruktor z.B., wie sollten die auch definiert werden.



  • ab jetzt halte ich mich an shade 😉

    http://tutorial.schornboeck.net/oop2.htm



  • otze schrieb:

    unnamed objekte sind nicht standardkornform

    Von solchen hat ja auch niemand gesprochen.

    Bashar schrieb:

    Für unbenannte Klassen gibt es logischerweise ein paar Einschränkungen, kein Konstruktor und Destruktor

    ...keine static Member und Methoden...



  • Danke für die Antworten. Ich suche nach sinnvollen Anwendungen dieser namenlosen Klassen.

    Nullzeiger Klasse? Beispiel?
    Weitere Beispiele?



  • Für den kommenden C++ Standard gibt es Leute, die einen Vorschlag eingereicht haben für ein nullptr Schlüsselwort. In dem Dokument zeigen sie (oder verweisen, da kann ich mich nicht mehr so genau erinnern) wie man das momentan mit einer Klasse "simulieren" kann. Ich hab mir das für meine Zwecke noch ein bissl zurechtgebogen und benutze das auch.

    const class
    {
    private:
    	// no address
    	void operator &() const;
    public:
    	// convert to non-member pointer
    	template <class T>
    	operator T*() const
    	{
    		return 0;
    	}
    	// convert to member pointer
    	template <class T, class C>
    	operator T C::*() const
    	{
    		return 0;
    	}
    } null = {};
    

    Wie sinnvoll so etwas ist, ist sicherlich Geschmackssache. Hab aber damit tatsächlich schon Ungereimtheiten in meinem Code beseitigen können. Da stand in einer Initialisierungsliste für ein unsigned int Member ungefähr sowas:

    class A
    {
    private:
        unsigned int i_;
        //...
    public:
        A()
            : i_(NULL)
        {
        }
        //...
    };
    

    Ist wohl irgendwie bei Copy & Paste versehentlich passiert. Jedenfalls ist das problemlos compilierbar, macht aber keinen wirklichen Sinn. Benutzt man hingegen die Nullzeiger Klasse statt NULL bekommt man richtigerweise einen Compilerfehler.



  • Fall 1)

    A() : i_(NULL) {}
    

    [Warning] initialization to non-pointer type unsigned int' from NULL [Warning] argument to non-pointer typeunsigned int' from NULL

    Fall2)

    A() : i_(null) {}
    

    cannot convert `const <anonymous struct>' to `unsigned int' in initialization

    Thx for the great example!



  • @groovemaster2002
    Trotzdem würd ich der Klasse einen Namen geben und wenn er nur dazu dient um Fehlermeldungen wie `` sie gezeigt hat verständlicher zu machen.



  • @``
    Wenn du schon versuchst sarkastisch zu sein, dann beweise wenigstens Rückgrat und registriere dich.

    Ausserdem ging dein Schuss ziemlich nach hinten los falls du's noch nicht bemerkt hast. Keine Ahnung welchen Compiler du benutzt der solche spezifischen Warnungen bei Fall 1 bringt, meiner tut's jedenfalls nicht. Und das ist gut so. NULL ist kein Schlüsselwort und weist auch keine andere C++ builtin Charakteristik auf. Es ist "lediglich" ein Makro. Und wie du hoffentlich weisst, gehören diese dem Präprozessor. Theoretisch darf der Codeparser gar kein NULL mehr sehen, sondern nur den dafür ersetzten Text. Was macht dein Compiler eigentlich, wenn jemand ein umgeleitetes Makro ala NULL_PTR benutzt? Und die Hauptsache hast du gar nicht bedacht. Trotz der Warnungen lässt es sich kompilieren, und leider ignorieren viel zu viele Leute Warnungen oder schalten diese ganz ab.
    Zu Fall 2, siehe nachfolgend.

    Irgendwer schrieb:

    Trotzdem würd ich der Klasse einen Namen geben und wenn er nur dazu dient um Fehlermeldungen wie `` sie gezeigt hat verständlicher zu machen.

    Würde ich der Klasse einen Namen geben, wäre ich wohl im falschen Thread. 😉
    Richtig ist, dass manche Fehler nicht immer sofort eindeutig zugeordnet werden können. Besonders wenn in C++ diverse "Tricks" angewand werden, um eine gewisse Funktionalität zu gewährleisten. Deshalb ist eine gute Code Dokumentation fast so wichtig wie der eigentliche Code selbst. Und jeder gängige Compiler sollte dir zumindest die Datei und Zeile sagen können, wo diese 'const <anonymous struct>' zu finden ist. Alles weitere ist dann noch ein bisschen Denkarbeit, aber das solltest du doch als Programmierer gewohnt sein, oder?



  • Hätte die Klasse einen Namen, könnte man Funktionen für den Nullzeiger überladen. Inwiefern das nützlich ist kann ich nicht sagen.


Anmelden zum Antworten