class in class initialisieren



  • Danke für die Antworten!

    X::X(): bla_(*(new Y())) { } // Default Ctor
    

    also das funktioniert mal ...
    aber Speicherlecks sind nicht das was ich will ....

    Auch die anderen Code Snippets funktionieren. Das Y is eigentlich nur eine
    print Klasse da passiert gar nix außer 2 Methoden die nen char* entgegennehmen und aufm Bildschirm ausgeben.

    Wie wär den das schlauer zu machen?

    wenn ich in der cpp keinen default constructor einbaue sondern nur in der .h
    gibts auch keine warning ... warum?
    allerdings muss ich leider einen char array initialisieren und
    dafür brauch ich den Constructor ....



  • diego2k schrieb:

    X::X(): bla_(*(new Y())) { } // Default Ctor
    

    also das funktioniert mal ...
    aber Speicherlecks sind nicht das was ich will ....

    Dann ist ja gut.

    diego2k schrieb:

    Auch die anderen Code Snippets funktionieren. Das Y is eigentlich nur eine
    print Klasse da passiert gar nix außer 2 Methoden die nen char* entgegennehmen und aufm Bildschirm ausgeben.

    Wie wär den das schlauer zu machen?

    Du bist ja ein Spaßvogel. Zeigst hier zwei Klassen X und Y und fragst, wie's besser geht. Besser wäre natürlich die Klassen A und B zu nennen! 🙄

    Wenn Du etwas konstruktiveres hören willst, musst Du schon mit mehr Infos rausrücken...

    diego2k schrieb:

    wenn ich in der cpp keinen default constructor einbaue sondern nur in der .h
    gibts auch keine warning ... warum?

    Wieso sollte es die geben? Machst ja nix verbotenes, dann. Du kannst den Default-Ctor nur dann nicht aufrufen, weil er nur deklariert und nicht definiert wurde. :p

    diego2k schrieb:

    allerdings muss ich leider einen char array initialisieren und
    dafür brauch ich den Constructor ....

    Was für'n char-Array? Zeig doch mal.



  • wenn ich in der cpp keinen default constructor einbaue sondern nur in der .h
    gibts auch keine warning ... warum?

    Solange nirgends der Standardkonstruktor gebraucht wird, gibt's keinen Fehler.
    Vielleicht könntest du eine globale Instanz dieser Klasse verwenden für den Standardkonstruktor verwenden.

    Ein bisschen Code dieser print-Klasse wäre gut.



  • naja da gibts nicht viel zu sehen:

    //Y.h
    class Y
    {
    private:
      Y(const Y& quelle);
      Y &operator=(const Y& quelle);
    public:
      Y();
      virtual ~Y() throw();
      void print1(const char* a, ...) const;
      void print2(const char* a, ...) const;
    };
    
    //Y.cpp
    Y::Y(){}
    void Y::print1(const char* a, ...) const
    {
      std::cout << a << std::endl;
    }
    void Y::print2(const char* a, ...) const
    {
      std::cout << a << std::endl;
    }
    Y::~Y()throw(){}
    


  • diego2k schrieb:

    naja da gibts nicht viel zu sehen:

    Deine Codes machen alle hinten und vorne keinen Sinn...

    Kannst du mal etwas mehr Code per Copy&Paste posten?



  • diego2k schrieb:

    //Y.h
    class Y
    {
    private:
      X(const X& quelle);
      X &operator=(const X& quelle);
    public:
      X();
      virtual ~X() throw();
      void print1(const char* a, ...) const;
      void print2(const char* a, ...) const;
    };
    

    Mal davon abgesehen, dass Du hier ein paar Xs stehen hast, die Ys hätten sein sollen: Was soll das? Was ist der Sinn dieser Klasse? Warum hat sie keine Datenelemente? Warum hat sie einen virtuellen Destruktor und sonst nichts anderes virtuelles? Wozu ist das gut? Soll das so eine Art "Interface" (im Java-Sinne)? Dann hättest Du vergessen, print1 und print2 pur virtuell zu machen. Dann wären aber auch Deine Deklarationen von copy_ctor und op= überflüssig.

    Wann soll wo wie ein Y erstellt werden, wenn Du den Default-Ctor von X benutzen willst? Und wer soll das Ding wieder löschen?

    So kann man Dir nicht helfen.



  • hubs da haben sich ein paar Y in X verwandelt.

    naja das ist die Vorgabe ob das jetzt sinn macht oder nicht ... sie darf nicht angefasst werden...

    in meiner Klasse X soll jedenfalls genau das ein Member sein:
    Y& bla_;

    class X
    {
    private:
    Y& bla_;
    char* _text;
    public: 
    X();
    X(Y& bla);
    X(Y& bla, const char* text);
    void setText(const char* text);
    const char * getText() const {return _text;}
    }
    

    der "text" gehört natürlich Dyn. verwaltet, darum möchte ich im Constructor wenigstens ein "" drauf tun...



  • Weiters habe ich noch ein porblem:

    class Z
    {
    public: 
      bool add(const X& meinX);
    };
    
    class X
    {
    private:
      Y& bla_;
      char* _text;
      Z* _meinZ;
    public: 
      X();
      X(Y& bla);
      X(Y& bla, const char* text);
      void setText(const char* text);
      const char * getText() const {return _text;}
    }
    

    ich würde bei Z ein include für X brauchen und bei X ein include für Z.
    Was aber natürlich nicht funktioniert.



  • ich würde bei Z ein include für X brauchen und bei X ein include für Z.

    Du würdest bei keinem ein include für keins brauchen, da du in der Klassendefinition von Z nur eine Referenz von X brauchst, reicht eine Deklaration von X, also einfach noch class X; vor die Klassendefinition schreiben.

    In der Klassendefinition von X brauchst du auch nur einen Zeiger auf Z, weswegen wieder eine Deklaration von Z reicht (class Z;).

    In den Implementierungsdateinen musst du dann natürlich inkludieren, weil du wahrscheinlich auf Member der jeweils anderen Klasse zugreifen möchtest, aber wenn du include guards verwendest, ist das kein Problem mehr.

    Aber was ist das eigentlich für eine Aufgabe? Die Klassen sind hochgradig sinnlos und auch der Code ist seltsam. Was soll z.B. hier die variable Argumentenliste:

    void Y::print1(const char* a, ...) const
    

    Hat der Lehrer/Dozent euch nichts dazu gesagt? Was sollt ihr anhand dieser Übung lernen?



  • Bruder Lustig schrieb:

    Was sollt ihr anhand dieser Übung lernen?

    Wie man Code nicht schreiben sollte. 🤡

    Edit: Ja ist nicht grad das beste Kommentar. Aber mir fehlen da echt die Worte. Einen Standard-Konstruktor aber eine Referenz auf ein externes Objekt...

    Derjenige der sich das ausgedacht hat gehört gelyncht...

    Arme Studenten/Schüler..



  • DANKE! 🙂 🙂 🙂

    Naja ich hab jetzt doch schon ein paar Jahre mit C# und Java zu
    tun gehabt und eigentlich fühle ich mit in der oop recht wohl...
    Aber diese Übung 😕

    Das ganze sieht für mich so aus als hätte hier irgendwer ein Programm geschrieben,
    dann einige Seiten rausgelöscht und die Aufgabe ist jetzt, dass wieder herzustellen.(es sind nur mehr dieses Y und die Main vorhanden von 7 Klassen und natürlich diese "Tipps" welche Methoden und Attribute drin sind)

    Natürlich darf der Code der noch hier steht nicht verändert werden und es dürfen auch keine Klassen oder Methoden dazuerfunden werden.
    Wär ja noch okay, wenn irgendwo stehen würde was das Prgogramm gemacht hat ...
    aber diese Codeüberbleibsel sind ja auch nur ein Teil eines größeren Programms ...

    naja is mal was neues 🙂



  • Dann zeig doch mal die main, evtl. brauchst du ja gar keinen Standardkonstruktor.



  • ist eh nicht dabei ...
    aber es steht das er zu machen ist...



  • diego2k schrieb:

    Naja ich hab jetzt doch schon ein paar Jahre mit C# und Java zu
    tun gehabt und eigentlich fühle ich mit in der oop recht wohl...
    Aber diese Übung 😕

    Du unterschätzt die Unterschiede zwischen C++ und C#/Java. (Ja echt!)



  • Du unterschätzt die Unterschiede zwischen C++ und C#/Java. (Ja echt!)

    ist mir irgendwie auch aufgefallen 🤡


Anmelden zum Antworten