anfänger hat shared_ptr problem ;)



  • hallo,

    ich habe 2 klassen.

    class A
    {
    privat:
         int i;
    public:
         A();
         A(int num, int wert, int zahl);
         ~A();
    };
    
    class B
    {
    privat:
         shared_ptr<A> *classA;
    public:
         void show(void);
         B();
         ~B();
    };
    
    void B::show(void)
    {
          classA= new A(1,2,3); // ~ hier weiss ich nicht wie
    }
    

    syntaxfehler bitte entschuldigen das jetzt frei hand gewesen 🤡

    ich möchte in der klasse B die klasse A nutzen, jedoch gleich mit meinen eignem konstruktor welcher 3 werte übergeben bekommt.
    ich möchte das ganze so nutzen das ich kein delete benötige, also möchte ich shared_ptr dafür nehmen was sich ja selber verwaltet.

    das beispiel auf der boost seite ist leider mit vector und damit habe ich mich noch garnicht beschäftigt und brauch ich momentan auch nicht. kann mir bitte wer aufzeigen was der richtige syntax wäre um classA zu initialiseren? 🙄

    *anfänger fähnchen schwenk*



  • den shared_ptr solltest du auf dem stack anlegen. sonst brauchst du noch einen shared_ptr für den shared_ptr 😉



  • warum ist ClassA ein Zeiger?
    Du willst mit Hilfe von smart pointern ja verhindern, dass du mit raw Zeigern in Berührung kommst.



  • ups, das war jetzt gewohnheit.
    bis dato noch nix mit dieser art von pointern gemacht.

    weiss aber keiner wie ich classA= new A(1,2,3); diese zeile umschreiben muss das es funktioniert?



  • Wenn ich das jetzt richtig verstanden habe, sollte es so gehen:

    #include <iostream>
    #include <boost/shared_ptr.hpp>
    
    class A 
    { 
    private:
    	int a, b, c;
    public:
    	A();
    	A(int a, int b, int c);
    	inline int getA()
    	{
    		return a;
    	}
    }; 
    
    A::A() : a(0), b(0), c(0)
    {}
    
    A::A(int a, int b, int c) : a(a), b(b), c(c)
    {}
    
    class B 
    { 
    private:
    	boost::shared_ptr<A> classA;
    public: 
    	B(); 
    	int show();
    }; 
    
    B::B() : classA(new A(1, 2, 3))
    {}
    
    int B::show() 
    {
    	return classA->getA();
    }
    
    int main()
    {
    	B obj;
    	std::cout << obj.show();
    }
    


  • Der Konstruktor von shared_ptr ist explicit!



  • es geht mir nur im die initialisierung. welche auch machst .. das ganze hät ich auch einfacher sagen können indem ich klasse B weglasse und einfach schreibe:

    #include <boost/shared_ptr.hpp>
    
    using boost::shared_ptr;
    
    class A
    {
    privat:
         int i;
    public:
         A();
         A(int num, int wert, int zahl);
         ~A();
    };
    
    int main()
    {
    shared_ptr<A> classA;
    classA(new A(1, 2, 3)); // error C2064: Ausdruck ergibt keine Funktion
    
    return 1;
    }
    

    leider kommt in der kommentierten zeile ein error.

    jedoch wenn ich:
    shared_ptr<A> classA(new A(1, 2, 3));
    schreibe geht es.
    ich brauch es aber geteilt da ichs ja schlecht in klasse B gleich initialieren kann und auch nicht will.



  • Schau dir mal die Methode reset() an:

    #include <iostream>
    #include <boost/shared_ptr.hpp>
    
    class A 
    { 
    private:
    	int a, b, c;
    public:
    	A(int a, int b, int c);
    	inline int getA()
    	{
    		return a;
    	}
    }; 
    
    A::A(int a, int b, int c) : a(a), b(b), c(c)
    {}
    
    int main()
    {
    	boost::shared_ptr<A> classA;
    	classA.reset(new A(1, 2, 3));
    	std::cout << classA->getA();
    }
    


  • ahhaaaaa. jetzt haben wir des rätsels lösung. au fein es klappt nun alles. vielen dank für eure liebe geduldige hilfe 🤡



  • bitte 🙂
    übringes ist auch

    classA = boost::shared_ptr<A>(new A(1, 2, 3));
    

    möglich


Anmelden zum Antworten