Я немного поиграл с использованием shared_ptr и enable_shared_from_this, в то время как я сталкивался с тем, чего я действительно не понимаю.
В моей первой попытке я построил что-то вроде этого:
class shared_test : std::enable_shared_from_this<shared_test> {
public:
void print(bool recursive) {
if (recursive) {
shared_from_this()->print(false);
}
std::cout << "printing" << std::endl;
}
};
Обратите внимание, что этот класс расширяет std:: enable_shared_from_this в частном порядке. Это, по-видимому, имеет большое значение, поскольку выполняется что-то вроде этого:
int main() {
auto t(std::make_shared<shared_test>());
t->print(true);
return 0;
}
генерирует исключение bad_weak_ptr. Где, как если бы я изменил определение класса, чтобы оно было открыто публично из std:: enable_shared_from_this, этот пробег просто находит.
Почему, что мне здесь не хватает? И нет ли способа заставить его работать для частного наследования, поскольку "внешний мир" класса shared_test не должен знать, что он разрешает совместное использование этого... (по крайней мере, если вы не спросите меня, или я что-то пропущу?)