دسترسی نداشتن به سازنده در خود کلاس - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

دسترسی نداشتن به سازنده در خود کلاس

+1 امتیاز

سلام دوستان عزیز.

به مشکل عجیبی برخورد کردم سازنده کلاس پروتکتد تعریف شده ولی متد استاتیک به اون دسترسی نداره خطای زیر را میده .

Child::Child(const string&)’ is protected within this context


template<typename BaseClass_>
class Parent
{
public:
protected:
	static std::shared_ptr<Parent> instance1_ ;
    Parent(const std::string& path){
        
    }
    virtual ~Parent(){}
};
template<typename BaseClass_>
std::shared_ptr<Parent<BaseClass_>> Parent<BaseClass_>::instance1_ = nullptr;

class Foo{
    public:
};

class Child :public Parent<Foo>{
public:
    static std::shared_ptr<Child> getInstance(const std::string& path){
       if (instance1_ == nullptr)
          instance1_ =  std::dynamic_pointer_cast<Parent<Foo>>( std::make_shared<Child>(path));
       return std::dynamic_pointer_cast<Child>(instance1_);
       return nullptr;
   }
    protected:
    Child(const std::string& path):Parent<Foo>(path){}
};

 

سوال شده خرداد 8, 1399  بوسیله ی COLD (امتیاز 200)   4 28 37
اگر از استاندارد C++17 استفاده می‌کنید، نیازی به مقدادهی خارج از کلاس متغیرهای static نیست. کافیه که inline static تعریف کنید.

2 پاسخ

+3 امتیاز
 
بهترین پاسخ

متغیر از نوع استاتیک جهت آماده سازی استفاده کنید.

static std::shared_ptr<Child> temp(new Child(path));
 instance1_ = temp;

 

پاسخ داده شده خرداد 8, 1399 بوسیله ی عباس مولایی (امتیاز 2,754)   1 5 13
انتخاب شد خرداد 11, 1399 بوسیله ی COLD
0 امتیاز



وقتی با استفاده از Make_shared میخواهید یک فضای حافظه ای از هیپ برای کلاس Child اختصاص بدید، حتما باید سازنده کلاس Child خارج ازحوزه دید کلاس هم قابل دسترس باشد، در غیر اینصورت راهی ندارید که از حافظه هیپ فضایی allocate کنید.به همین علت هست که کامپایلر خطا میدهد که به سازنده کلاس نمی تواند دسترسی داشته باشد. ونکته بعدی اینکه در کد شما ابهام وجود داشت یعنی UpCast ,DownCast رعایت نشده بود که به صورت زیر اصلاح کردم.

#include <iostream>
#include <memory>

using namespace std;
class Foo{
public:
};
class Child;
template<typename BaseClass_>
class Parent
{
public:
    static std::shared_ptr<Parent<BaseClass_>> instance_ ;
    virtual ~Parent(){}
    static std::shared_ptr<Child> getInstance(std::string& path){
        if (instance_ == nullptr){
            auto upCast = std::make_shared<Child>(path);
            instance_ =  std::static_pointer_cast<Parent<Foo>>(upCast);
            return std::dynamic_pointer_cast<Child>(instance_);
        }
        return nullptr;
    }
protected:
    explicit Parent( std::string& path){}
    Parent(){};
};
template<typename BaseClass_>
std::shared_ptr<Parent<BaseClass_>> Parent<BaseClass_>::instance_ = nullptr;


class Child : public Parent<Foo>{
public:
    using Parent<Foo>::getInstance;
    explicit Child( std::string& path):Parent<Foo>(path){}
};

int main() {
    std::string path = "test";
    auto makeChileShared = Child::getInstance(path);

    return 0;
}

 

پاسخ داده شده خرداد 10, 1399 بوسیله ی فرهاد شیری (امتیاز 97)   1 3
ویرایش شده خرداد 11, 1399 بوسیله ی فرهاد شیری
برای چی تو کلاس Parent کلاس child را ساختید اصلا کلاس Parent از وجود کلاس child خبره نداره
...