Instanziierung nur durch speziellen Konstruktor



  • Hallo,

    ich möchte, dass eine Instanz meiner Klasse nur mit einem speziellen, von mir geschriebenen Konstruktor erstellbar ist. Dieser Konstruktor will 2 Argumente.

    Beispiel:

    CMyClass MyClass(type myParam1, type myParam2); //soll möglich sein und immer so gemacht werden
    
    CMyClass MyClass() //Instanziierung über std-Konstruktor soll nicht möglich sein
    

    Diese beiden Möglichkeiten gibt es ja nur, wenn ich keine Andere implementiere, richtig? Wie kann ich also verhindern, dass über den std-Konstruktor instanziiert werden kann? Natürlich könnte ich den std-Konstruktor einfach implementieren und abfangen (MessageBox rausknallen), und so würde ich das auch machen, aber ich frage mich, ob es eleganter geht, so dass der Compiler direkt meckert ;D!?



  • Mach den Standardkonstruktor einfach privat.

    class foo
    {
    public:
     foo (int x, int y );
    private:
     foo ();
    };
    


  • Sobald du einen anderen Konstruktor definierst, wird der Standardkonstruktor nicht mehr automatisch erstellt. Folglich musst du diesen auch nicht verbieten.



  • @Nexus: Doch, leider geht beides!
    @drakon: Das privat machen hilft leider auch nicht!



  • auf drakons Beispiel bezogen sieht mein aufruf jetzt so aus:

    foo(1, 2);
    foo();
    

    Der Compiler kompiliert und auch zur Runtime gibts keine Probs, es soll aber nur der erste Aufruf erlaubt sein!



  • KloppiDeluxe schrieb:

    @Nexus: Doch, leider geht beides!
    @drakon: Das privat machen hilft leider auch nicht!

    Doch da hat Nexus schon recht. Eigentlich braucht man ihn nicht mal privat zu machen.

    Was hast den du für einen Compiler?



  • KloppiNochmal schrieb:

    auf drakons Beispiel bezogen sieht mein aufruf jetzt so aus:

    foo(1, 2);
    foo();
    

    Der Compiler kompiliert und auch zur Runtime gibts keine Probs, es soll aber nur der erste Aufruf erlaubt sein!

    Mach mal so:

    foo g(1, 2);
    foo f;
    


  • Beides kann nicht sein. Verwendest du einen derart nicht standardkonformen Compiler?

    Es geht ja darum, eine Instanz ausserhalb der Klasse zu erstellen, oder? Zeig ansonsten ein bisschen mehr Code (wie die Klasse jetzt aussieht, und wie (und auch wo) sie instanziiert wird).



  • Ich verwende MS VS 2008 Prof. Edition, sollte also nicht das Problem sein 😉 .

    Genau, die Instanz wird in der WinMain() erstellt, also außerhalb der Klasse.

    Folgender Aufruf funktioniert nicht (sry, vorher hatte ich das Cfoo vergessen):

    Cfoo foo;
    

    Ich möchte aber, dass dieser hier auch nicht funktioniert:

    Cfoo foo();
    

    Nur dieser soll erlaubt sein:

    Cfoo foo(1, 2);
    


  • Ah. 🙂

    Das ist weder ein Aufruf noch eine Objekt-Instanziierung, sondern eine Funktionsdeklaration. Du brauchst dir also keine Sorgen zu machen, der Standardkonstruktor wird nicht aufgerufen. 😉



  • Kloppi schrieb:

    Ich möchte aber, dass dieser hier auch nicht funktioniert:

    Cfoo foo();
    

    Gegen den kannst du nichts machen, weil das eine Funktionsdeklaration ist. Da wird gar kein Objekt erzeugt.



  • Achso, ich verstehe .. also wenn das einer in seine WinMain() schreibt ist das einfach nur effekt-/sinnfrei, wird sicher vom Compiler wegoptimiert, weil die funktion net benutzt wird und keinen Inhalt hat, oder!?

    Aber warum meckert mein Compiler nicht, dass die Funktion nicht benutzt wird, nix returned und so weiter...?

    Danke allen Beteiligten schonmal 😉 👍 !



  • KloppiDankt schrieb:

    Achso, ich verstehe .. also wenn das einer in seine WinMain() schreibt ist das einfach nur effekt-/sinnfrei, wird sicher vom Compiler wegoptimiert, weil die funktion net benutzt wird und keinen Inhalt hat, oder!?

    Aber warum meckert mein Compiler nicht, dass die Funktion nicht benutzt wird, nix returned und so weiter...?

    Danke allen Beteiligten schonmal 😉 👍 !

    Tu mal die Warnungen aufs Maximum und dann noch Warnungen als Fehler behandeln..

    Dann hast dus. 😉



  • Die MSVC++-Warnungen sind wirklich gut.

    Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)



  • Tu mal die Warnungen aufs Maximum

    Wo? Danke!



  • Projekt -> Projekteigentschaften -> C/C++ -> Allgemein -> Warnungen als Fehler behandeln



  • drakon schrieb:

    Projekt -> Projekteigentschaften -> C/C++ -> Allgemein -> Warnungen als Fehler behandeln

    Das würde ich nicht unbedingt. Gewisse Warnungen sind nämlich nur zum Nerven da. 😃

    Die Warnstufe müsste man erhöhen.
    Projekteigenschaften -> C/C++ -> Warnstufe -> Level 4



  • Nexus schrieb:

    drakon schrieb:

    Projekt -> Projekteigentschaften -> C/C++ -> Allgemein -> Warnungen als Fehler behandeln

    Das würde ich nicht unbedingt. Gewisse Warnungen sind nämlich nur zum Nerven da. 😃

    Ja, schon.. z.B dass eine Variable nicht verwendet wird.. *argh*.. Die Implementierung kommt später. Am Anfang soll einfach alles da sein, was man braucht.. Das ist der Grund, warum ich auf 3 und nicht 4 bin..



  • Was mich ein bisschen genervt hat, war die Warnung in <boost/lexical_cast.hpp> wegen nicht erreichbarem Code. Das fand wohl einer von Boost lustig...

    Weisst du eigentlich grad, wie man Linkerwarnungen wegbekommt?


Anmelden zum Antworten