probleme mit enable_shared_from_this [gelöst]



  • Hallo.

    Ich möchte enable_shared_from_this verwenden, weil ich in einer abgeleitenen Basisklasse einen shared_ptr weitergeben möchte, aber leider bekomme ich das ganze nicht ordentlich hin 😕

    Hier ein Beispiel so wie bei mir der Anwendungsfall ist:

    #include <string>
    #include "boost/enable_shared_from_this.hpp"
    #include "boost/shared_ptr.hpp"
    
    class StoreData 
    {
    	public:
    		std::string name_;
    		std::string desc_;
    	public:	
    		StoreData(){}
    };
    
    template <typename ClassData>
    class StoreClass
    {
    public:
    	typedef boost::shared_ptr<ClassData> ClassDataPtr;
    	std::vector<ClassDataPtr> storeData_;
    
    public:
    	StoreClass() {}
    	void Add(const std::string &a, const std::string &b)
    	{
    		ClassDataPtr ptr(new ClassData());
    		ptr->name_ = a;
    		ptr->desc_ = b;
    		storeData_.push_back(ptr);
    	}
    };
    
    class MyStoreData;
    typedef StoreClass<MyStoreData>::ClassDataPtr MyStoreDataPtr;
    class MyStoreData : public boost::enable_shared_from_this<MyStoreData>, StoreData
    {
    	public:
    		MyStoreData(){}
    		MyStoreDataPtr GetPtr() { return shared_from_this();}
    };
    
    int main()
    {
    	StoreClass<MyStoreData> store;
    	store.Add("abc", "012");
    }
    

    Beim Compilieren bekomme ich folgende Fehler:

    test.h: In member function ‘void StoreClass<ClassData>::Add(const std::string&, const std::string&) [with ClassData = MyStoreData]’:
    test.cpp: instantiated from here
    test.h: error: ‘std::string StoreData::name_’ is inaccessible
    test.h: error: within this context
    test.h: error: ‘std::string StoreData::desc_’ is inaccessible
    test.h: error: within this context

    Mache ich in der Klasse MyStoreData Zugriffsmtehoden, dann sind die Fehlermeldugnen weg, aber warum?

    interessant ist auch, wenn man MyStoreData folgend ableitet (Änderung der Reihenfolge der zu ableitenden Klassen)

    class MyStoreData : public StoreData,  boost::enable_shared_from_this<MyStoreData>
    

    dann sieht die Fehlermeldung des compilers so aus:

    In file included from /boost/boost/enable_shared_from_this.hpp:16,
    from test.h,
    from test.cpp:
    /boost/boost/smart_ptr/enable_shared_from_this.hpp: In member function ‘boost::shared_ptr<X> boost::enable_shared_from_this<T>::shared_from_this() [with T = MyStoreData]’:
    test.h: instantiated from here
    /boost/boost/smart_ptr/enable_shared_from_this.hpp:50: error: ‘boost::enable_shared_from_this<MyStoreData>’ is an inaccessible base of ‘MyStoreData’
    In file included from /boost/boost/smart_ptr/weak_ptr.hpp:18,
    from /boost/boost/smart_ptr/enable_shared_from_this.hpp:16,
    from /boost/boost/enable_shared_from_this.hpp:16,
    from test.h,
    from test.cpp:38:
    /boost/boost/smart_ptr/shared_ptr.hpp: In constructor ‘boost::shared_ptr<T>::shared_ptr(Y*) [with Y = MyStoreData, T = MyStoreData]’:
    test.h: instantiated from ‘void StoreClass<ClassData>::Add(const std::string&, const std::string&) [with ClassData = MyStoreData]’
    test.cpp: instantiated from here
    /boost/boost/smart_ptr/shared_ptr.hpp:189: error: ‘boost::enable_shared_from_this<MyStoreData>’ is an inaccessible base of ‘MyStoreData’

    Ist die Anwendung von enable_shared_from_this falsch oder beachte ich hier etwas nicht?
    ev. kann mir jemand weiter helfen? DANKE!



  • Ich vermute mal, du musst bei beiden public hinschreiben.



  • ach du schande, dass war ja nun ordentlich peinlich 😡 😞 🙄
    danke! da hab ich wieder mal den wald vor lauter bäumen nicht gsehen 🙄



  • Deine 'GetPtr()' Methode ist unnötig.
    Wenn du von boost::enable_shared_from_this<> ableitest, bekommt die abgeleitene Klasse eine public Methode shared_from_this().

    Wenn du jedoch die 'GetPtr' Methode behalten willst, dann würde ich die 'shared_from_this()' Methode verstecken.

    class X : public boost::enable_shared_from_this<X> {
    private:
            using boost::enable_shared_from_this<X>::shared_from_this; // hiding method
    public:
            boost::shared_ptr<X> GetPtr() {
                    return shared_from_this();
            }
    };
    

Anmelden zum Antworten