我在使用shared_ptr和enable_shared_from_this時玩了一會兒,而遇到了一些我不太瞭解的東西。std :: enable_shared_from_this;公共vs私人
在我第一次嘗試我構建了這樣的事情:
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類的「外部世界」不需要知道它是從這個共享中啓用的......(至少,如果你問我,或者我再次錯過什麼?)
有趣的是,錯誤是運行時錯誤,而不是私人訪問編譯錯誤。在我能想到的所有其他情況下,佈局,決心,......完全沒有區別。訪問控制是最後一次獨立完成的,其中#define private public給出相同的目標文件。 –
@JohanLundberg對於「外部世界」,私有繼承與無繼承之間沒有(邏輯)區別。私有繼承意味着'is_base_of,shared_test>'爲false,這是一個編譯時測試,它控制'shared_ptr'構造函數生成的代碼。 –
Oktalist
@Oktalist。謝謝 - 我遵循。我在評論中寫的很明顯並不適用於繼承。 –