Basisklasseninstanz "verbieten" & mehrdimensionale Arrays mit new



  • 1.) Wie kann ich dafür sorgen, dass von meiner "normalen" Basisklasse keine Instanz erstellt werden kann?

    2.) Ist es möglich mit new ein 2- oder mehrdimensionales Array zu erstellen? Und wenn ja. Wie?

    Danke



  • zu 1: lass eine funktion pure virtual.
    zu 2: nicht direkt.



  • Zu deiner ersten Frage, das geht am einfachsten so:

    class MyClass
    {
       virtual ~MyClass() = 0;
    };
    
    MyClass::~MyClass(){}
    


  • Zu 1: Konstruktor(en) protected machen.
    Gruss Simon



  • Programmierer schrieb:

    2.) Ist es möglich mit new ein 2- oder mehrdimensionales Array zu erstellen? Und wenn ja. Wie?

    Danke

    Wenn die Dimensionen beim Compilieren bekannt sind, geht es z.B. so:

    int main() {
    
    	const int a = 3;
    	const int b = 4;
    	const int c = 5;
    
    	typedef int(*Ptr)[b][c];	
    
    	Ptr arr = new int[a][b][c];
    
    	arr[0][0][4]  = 4711; 
    
    	delete [] arr;
    return 0;
    }
    mfg
    


  • Zu 2.:

    int** Array2D = new int*[x];
    for (int i = 0; i < x; ++i)
    {
        Array2D[i] = new int[y];
    }
    

    Und wieder schön aufräumen (mit delete[] , nicht delete ):

    for (int i = 0; i < x; ++i)
    {
        delete[] Array2D[i];
    }
    delete[] Array2D;
    


  • Bitte nicht. Wenn du ein rechteckiges Array hast (also die Länge der Zeilen bzw. Spalten immer gleich ist), dann ist Nexus' Lösung nicht so doll.

    Benutz' ein eindimensionales Array der Größe n * m und rechne den Index um: a[x][y] entspricht a[n*x + y] oder sowas.

    Zu 1.: Der riesige Vorteil an Simons Lösung ist, dass du dem Benutzer der Basisklasse keine Laufzeitpolymorphie aufzwingst. Er muss nur die Konstruktoren implementieren, was man sowieso für fast jede Klasse macht.



  • .filmor schrieb:

    Zu 1.: Der riesige Vorteil an Simons Lösung ist, dass du dem Benutzer der Basisklasse keine Laufzeitpolymorphie aufzwingst. Er muss nur die Konstruktoren implementieren, was man sowieso für fast jede Klasse macht.

    Bei abstrakten Basisklassen ist es denke ich Ok von laufzeit polymorphie auszugehen...

    zumal ctors protected zu machen niemanden daran hindert objekte der klasse zu erstellen...



  • Shade Of Mine schrieb:

    zumal ctors protected zu machen niemanden daran hindert objekte der klasse zu erstellen...

    Das versteh ich jetzt mal nicht. Was meinst du?

    @irgendwo weiter oben:
    Einen rein virtuellen Destruktor finde ich von der Semantik immer ziemlich fragwürdig.



  • Zu deiner 1. Frage: du könntest dich nach "singleton" design pattern umsehen, da gibt es sicher genügend



  • Basingstoke schrieb:

    Zu deiner 1. Frage: du könntest dich nach "singleton" design pattern umsehen, da gibt es sicher genügend

    Singleton -> Genau eine Instanz, nicht genau keine.
    Demnach nicht sinnvoll.
    Simon



  • Kann man auf Instanz nicht auch einen Wortfilter legen? *scnr* Die paar Male, wo dieses Wort hier im Forum richtig benutzt wird, kann man wohl auch unter den Tisch fallen lassen...



  • 7H3 N4C3R schrieb:

    Kann man auf Instanz nicht auch einen Wortfilter legen? *scnr* Die paar Male, wo dieses Wort hier im Forum richtig benutzt wird, kann man wohl auch unter den Tisch fallen lassen...

    was meinst du damit?



  • Dass Instanz eine weitverbreitete Fehlübersetzung von "instance" (was in dem Zusammenhang, in dem es mal benutzt wurde, wörtlich "Beispiel" heißt und "Objekt" gemeint ist) ist.



  • 7H3 N4C3R schrieb:

    Dass Instanz eine weitverbreitete Fehlübersetzung von "instance" (was in dem Zusammenhang, in dem es mal benutzt wurde, wörtlich "Beispiel" heißt und "Objekt" gemeint ist) ist.

    http://de.wikipedia.org/wiki/Instanz_(Informatik)



  • 7H3 N4C3R schrieb:

    Shade Of Mine schrieb:

    zumal ctors protected zu machen niemanden daran hindert objekte der klasse zu erstellen...

    Das versteh ich jetzt mal nicht. Was meinst du?

    Vielleicht, dass wenn man eh schon eine abstrakte Basisklasse hat (was aber der OP mit dem „normal“ denke ich gerade ausgeschlossen hat) man ja nichts zusätzlich aufzwingt, wenn man einen rein virtuellen Destruktor hinzufügt. Man kann sogar den Basisklassendestruktor trotzdem etwas tun lassen.

    Jester schrieb:

    7H3 N4C3R schrieb:

    Dass Instanz eine weitverbreitete Fehlübersetzung von "instance" (was in dem Zusammenhang, in dem es mal benutzt wurde, wörtlich "Beispiel" heißt und "Objekt" gemeint ist) ist.

    http://de.wikipedia.org/wiki/Instanz_(Informatik)

    Haha! 😃



  • .filmor schrieb:

    Jester schrieb:

    http://de.wikipedia.org/wiki/Instanz_(Informatik)

    Haha! 😃

    :p Sekunde, das muss ich gerade mal editieren 😃 In Wikipedia steht doch eh nur nicht fundierter Mist drin 🤡

    .filmor schrieb:

    7H3 N4C3R schrieb:

    Shade Of Mine schrieb:

    zumal ctors protected zu machen niemanden daran hindert objekte der klasse zu erstellen...

    Das versteh ich jetzt mal nicht. Was meinst du?

    Vielleicht, dass wenn man eh schon eine abstrakte Basisklasse hat (was aber der OP mit dem „normal“ denke ich gerade ausgeschlossen hat) man ja nichts zusätzlich aufzwingt, wenn man einen rein virtuellen Destruktor hinzufügt. Man kann sogar den Basisklassendestruktor trotzdem etwas tun lassen.

    Worauf ich hinaus wollte ist das hier:

    class Base
    {
    protected:
      Base();
      Base( const Base&);
    };
    
    Base b; //<<< geht nicht
    

    Also mich hindert es, Objekte der Klasse zu erstellen 😕 Deshalb verstehe ich nicht, worauf Shade hinaus will, weil er das eigentlich nicht meinen kann.



  • essentiell- wichtiges detail diese diskussion über instanz...



  • 7H3 N4C3R schrieb:

    Also mich hindert es, Objekte der Klasse zu erstellen 😕 Deshalb verstehe ich nicht, worauf Shade hinaus will, weil er das eigentlich nicht meinen kann.

    Vielleicht eine Instanziierung der Basisklasse durch eine abgeleitete Klasse. protected ist ja schon fast public 😉



  • Aber genau das wäre ja auch im Sinne der Frage des OP. Ich glaube aber ich weiß, was er meinte. 🙂 (vermutlich, dass protected-Konstruktoren sich nur auf die Klasse selbst auswirken und pure virtual Methoden auf alle Ebenen bis zum Überschreiben - hat imho beides sein für und wider)


Anmelden zum Antworten