Как получить доступ к закрытым членам класса из его частного конструктора - PullRequest
0 голосов
/ 20 ноября 2018

У меня следующий класс, и здесь я пытаюсь получить доступ к закрытым членам класса из частного конструктора.

class House {
private:
    int len;
    int wid;
    House()
    {
    }
public:
    ~House() 
    {
        std::cout << "destructor call" << std::endl;
    }
    static std::shared_ptr<House> house;
    static auto getHouse(const int length, const int width);

    void setlen(int lenth) { len = lenth; }
    void setwid(int width) { wid = width; }
    int getlen() { return len; }
    int getwid() { return wid; }
};

auto House::getHouse(const int length, const int width)
 {
    House::house = std::make_shared<House>();
    if ((House::house->getlen()==length) && (House::house->getwid()== width)) 
    {
        return House::house;
    }
    else
    {
        House::house->setlen(length);
        House::house->setwid(width);

        return House::house;
    }
}

Я получаю следующее сообщение об ошибке

Код серьезностиОписание Ошибка состояния подавления строки файла проекта C2248 «Дом :: Дом»: невозможно получить доступ к закрытому члену, объявленному в классе «Дом» TestC ++ c: \ program files (x86) \ microsoft visual studio \ 2017 \ community \ vc \ tools \ msvc \ 14.14.26428 \ include \ memory 1770

1 Ответ

0 голосов
/ 20 ноября 2018

Поскольку House не имеет общедоступного конструктора, коду вне класса не разрешено создавать House.Но вы пытаетесь сделать именно это, здесь:

House::house = std::make_shared<House>();

Реализация std::make_shared вызывает new для создания нового House, но std::make_shared не может получить доступ к частному конструктору House.Чтобы это исправить, вам нужно построить House самостоятельно:

House::house.reset(new House);
...