Konstruktor - Parameter später übergeben?



  • Hallo,

    angenommen ich habe zwei Klassen. Klasse A und Klasse B. In der Klasse A habe ich ein privates Objekt vom Typ B angelegt.
    Der Konstuktor von B erwartet allerdings Parameter. Wie kann ich die Parameter später übergeben, wenn Methoden von A aufgerufen werden?

    Beispiel:

    class A
    {
    public:
    	A();
    	void setBInteger(int i);		//Soll dem Konstuktor B übergeben werden
    	void setBChar(char c);		  //Soll dem Konstuktor B übergeben werden
    private:
    	B bobj;						 //bobj erwartet Übergabeparameter, ich kann diese noch nicht angeben, da erst die beiden Methoden aufgerufen werden sollen.
    };
    
    class B						     //Auf diese Klasse habe ich keinen Einfluss, bzw. ich kann sie nicht verändern. Ich kann die beiden Werte nur mit dem Konstruktor Aufruf übergeben.
    {
    public:
    	B(int i, char c);
    	void setTimeout(int t);
    
    private:
    	int timeout;
    }
    

    Ich hoffe das Beispiel ist deutlich, wie gesagt, es soll nur als Beispiel dienen. Natürlich könnte ich die beiden Methoden von A zusammenfassen
    und dann eine Instanz von B in der zusammengefassten Methode erzeugen. Das Objekt von B soll aber für die ganze Klasse verfügbar sein... 😕



  • A::A() : bobj(i,c) {}
    


  • Erzeuge das Objekt erst, wenn du all Werte hast (bobj dann halt als Pointer) oder erzeuge das Objekt dann neu.


  • Mod

    out schrieb:

    A::A() : bobj(i,c) {}
    

    i und c müssen noch irgendwoher kommen. Zum Beispiel:

    A::A(int i, char c) : bobj(i,c) {}
    

    @Threadersteller: Wie kann ein A ein unvollständiges B haben? Dann wäre A auch nicht vollständig. Also ist entweder ein B kein Teil von A (und es ist falsch, das B als Member von A zu haben) oder die Initialisierung von A ist unvollständig (outs und mein Code gehen dieses Problem an).



  • .


  • Mod

    Sone schrieb:

    So stell ich mir vor was du willst,

    😮 Glaubst du wirklich, dass er das will?



  • SeppJ schrieb:

    Sone schrieb:

    So stell ich mir vor was du willst,

    😮 Glaubst du wirklich, dass er das will?

    Natürlich nicht. Aber sein Design ist einfach so verdammt komisch, ich meine, hä? Wie, wann will er bobj erzeugen?



  • Wie, wann will er bobj erzeugen?

    Sobald ein Objekt von A erzeugt wird, soll auch eins von B erzeugt werden, sodass Methoden von A mit dem Objekt arbeiten können. Dass das Beispiel dort oben nicht funktionieren wird, ist mir bewusst. War ja auch nur dazu da um das ganze zu verdeutlichen.



  • Wenn du so etwas hast, dann nimmst du B als Pointer in A und initialisiert diesen auf 0 (im Konstruktor). Sobald die beiden nötigen Variablen gesetzt sind (und der Pointer immernoch 0 ist) erstellt du B. Und alle anderen Funktionen die B benutzen sollen müssen vorher abfragen ob B schon erstellt wurde und ansonsten eine vernünftige Fehlerbehandlung durchführen.



  • Fellhuhn schrieb:

    Wenn du so etwas hast, dann nimmst du B als Pointer in A und initialisiert diesen auf 0 (im Konstruktor). Sobald die beiden nötigen Variablen gesetzt sind (und der Pointer immernoch 0 ist) erstellt du B. Und alle anderen Funktionen die B benutzen sollen müssen vorher abfragen ob B schon erstellt wurde und ansonsten eine vernünftige Fehlerbehandlung durchführen.

    Das war praktisch was ich meinte! Mit Smart-Pointer.



  • Vielen Dank an alle für Hilfe. Habe es nun verstanden. 😃



  • Sone schrieb:

    Fellhuhn schrieb:

    Wenn du so etwas hast, dann nimmst du B als Pointer in A und initialisiert diesen auf 0 (im Konstruktor). Sobald die beiden nötigen Variablen gesetzt sind (und der Pointer immernoch 0 ist) erstellt du B. Und alle anderen Funktionen die B benutzen sollen müssen vorher abfragen ob B schon erstellt wurde und ansonsten eine vernünftige Fehlerbehandlung durchführen.

    Das war praktisch was ich meinte! Mit Smart-Pointer.

    Bei solchen merkwürdigen Anfragen gehe ich davon aus das der Compiler zu alt für unique_ptr ist.



  • Fellhuhn schrieb:

    Sone schrieb:

    Fellhuhn schrieb:

    Wenn du so etwas hast, dann nimmst du B als Pointer in A und initialisiert diesen auf 0 (im Konstruktor). Sobald die beiden nötigen Variablen gesetzt sind (und der Pointer immernoch 0 ist) erstellt du B. Und alle anderen Funktionen die B benutzen sollen müssen vorher abfragen ob B schon erstellt wurde und ansonsten eine vernünftige Fehlerbehandlung durchführen.

    Das war praktisch was ich meinte! Mit Smart-Pointer.

    Bei solchen merkwürdigen Anfragen gehe ich davon aus das der Compiler zu alt für unique_ptr ist.

    😮 Noch nicht mal Templates/Boost?



  • Gibt Leute die müssen auf der Arbeit immer noch mit "C-typischen" "C++" leben... Templates? Schön wäre es. 😞



  • Fellhuhn schrieb:

    Gibt Leute die müssen auf der Arbeit immer noch mit "C-typischen" "C++" leben... Templates? Schön wäre es. 😞

    Du armer, armer... gibt es etwas, das man für dich tun kann? Irgendwas?



  • Bier. 😃


Anmelden zum Antworten