der default konstruktor will nicht private sein (gcc)



  • hi, ich möchte den default-konstruktor als auch
    den copy-konstruktor meiner klasse private machen

    class dummy{
    private:
    dummy();
    dummy(dummy const&);
    };

    jetzt geht man ja davon aus, das man die klasse
    nicht mehr ohne argumente initialiseren kann,
    d.h.

    dummy d; // -> compile-time-error

    sollte darauf hinweisen, dass der konstruktor
    private ist. tut er auch. wenn man aber mit
    empty elippsis initialisiert

    dummy d(); // -> no compile-time-error

    beschwert er sich nicht, d.h. ruft zudem auch nicht
    den default constructor auf. nur welchen ruft er
    dann auf bzw. ergänzt der compiler ungefragt?

    danke, ingo.



  • loehken schrieb:

    nur welchen ruft er
    dann auf bzw. ergänzt der compiler ungefragt?

    Er ruft gar keinen auf, da du mit dummy d(); kein Objekt anlegst, sondern eine Funktion namens d deklarierst, die keine Parameter bekommt und ein dummy zurückgibt. Wenn du ein Objekt über den Default-Ctor initialisierst, musst du das also immer ohne die Klammern machen.



  • Übrigens mußt du den Default-Ctor nicht privat definieren, um ihn "auszuschalten" - der Compiler erzeugt dir nur einen Default-Ctor, wenn deine Klasse gar keinen selbstgeschriebenen Ctor hat.



  • HI loehken,

    probier mal zwei Dinge:
    1.) cpp-Tags hier im Forum und
    2.) ruf mal ein dummy-Attribut auf, dann wirst Du den Unterschied merken.

    class dummy{
       int i;
    private:
       dummy();
       dummy(dummy const&);
    };
    int main() {
       dummy d(); // -> no compile-time-error
       d.i = 1; // -> compile-time-error
    ...
    

    Die Fehlermeldung sagt vllt. etwas im Zusammenhang mit this->thats Post. 😃

    Gruß,

    Simon2.



  • this->that schrieb:

    loehken schrieb:

    nur welchen ruft er
    dann auf bzw. ergänzt der compiler ungefragt?

    Er ruft gar keinen auf, da du mit dummy d(); kein Objekt anlegst, sondern eine Funktion namens d deklarierst, die keine Parameter bekommt und ein dummy zurückgibt. Wenn du ein Objekt über den Default-Ctor initialisierst, musst du das also immer ohne die Klammern machen.

    dank dir, damit hats sich erledigt.



  • this->that schrieb:

    ...Wenn du ein Objekt über den Default-Ctor initialisierst, musst du das also immer ohne die Klammern machen.

    Kleine Ergänzung: Mit new ist das allerdings erlaubt (wenn auch unnötig).

    dummy* d1 = new dummy(); // eindeutig: Kann keine Funktion sein.
    dummy* d2 = new dummy;   // macht dasselbe
    

    Da gab's doch noch was im Zusammenhang mit "new[] und Initialisierung", wo das relevant war .... aber das fällt mir gerade nicht ein.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Da gab's doch noch was im Zusammenhang mit "new[] und Initialisierung", wo das relevant war .... aber das fällt mir gerade nicht ein.

    du meinst aber nicht die notwendigkeit, dass der default-konstruktor definiert
    sein muss, um arrays von dummy zu erstellen, oder, sprich:

    class dummy{
    dummy();
    };
    
    dummy d[3]; // -> compile-time error, default constructor of dummy is private.
    

    ingo.



  • Simon2 schrieb:

    Da gab's doch noch was im Zusammenhang mit "new[] und Initialisierung", wo das relevant war .... aber das fällt mir gerade nicht ein.

    Meinst Du das?

    int* a = new int[100]; // uninitialized
    int* a = new int[100] (); // default-initialized
    


  • Kann ich der "Array-Initialisierung" auch jeden beliebigen Ctor aufrufen?

    Weil dann ginge ja theoretisch auch sowas:

    T* foo = new T*[size](new T[size2](2));
    


  • LordJaxom schrieb:

    Simon2 schrieb:

    Da gab's doch noch was im Zusammenhang mit "new[] und Initialisierung", wo das relevant war .... aber das fällt mir gerade nicht ein.

    Meinst Du das?

    int* a = new int[100]; // uninitialized
    int* a = new int[100] (); // default-initialized
    

    Genau !!
    Das war's.

    Danke,

    Simon2.


  • Mod

    this->that schrieb:

    Kann ich der "Array-Initialisierung" auch jeden beliebigen Ctor aufrufen?

    Leider nicht. Man kann ein bisschen tricksen, indem man Defaultargumente nutzt - das ist allerdings etwas umständlich.


Log in to reply