der default konstruktor will nicht private sein (gcc)
-
hi, ich möchte den default-konstruktor als auch
den copy-konstruktor meiner klasse private machenclass 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 initialisiertdummy 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 dasselbeDa 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-initializedGenau !!
Das war's.Danke,
Simon2.
-
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.