當我發現這個問題時,我一直在嘗試統一迷宮生成。所以,我有一個 labyrinth_builder (lab_bui) 類,它為任何構建器演算法提供了基礎。
class lab_bui {
protected:
void say_hi() { std::cout ? "hi!" ? std::endl; }
};
然后我創建從 lab_bui 繼承的 uniform_labyrinth_builder (uni_lab_bui) 類,為任何統一生成樹(迷宮)演算法提供基礎。Uni_lab_bui 有一個嵌套類 Builder,用于在迷宮中行走,有時還會打破墻壁。
class uni_lab_bui : public lab_bui {
protected:
class Builder {
public:
Builder(uni_lab_bui* obj) : enclosing{obj} {} //2 overloads... WHY?
void say_bye() { std::cout ? "bye!" ? std::endl; this->enclosing->say_hi(); } //no errors, because it's a nested class
protected:
uni_lab_bui* enclosing;
};
};
然后我創建了一個繼承自 uni_lab_bui 的 aldous_broder 類。因此,它有一個 Builder 嵌套類,因此我可以創建繼承自 Builder 的 AB_Builder 嵌套類。由于 Builder 是嵌套的,因此它對 uni_lab_bui 的所有成員具有所有訪問權限,因此對所有成員 lab_bui 具有所有訪問權限。同樣的邏輯適用于 AB_Builder 但繼承,為什么會破壞一切,AB_Builder 無法訪問lab_bui 的受保護成員。
class aldous_broder : public uni_lab_bui {
public:
void ult() {
AB_Builder b(this);
b.speak();
}
protected:
size_t field{ 0ull };
class AB_Builder : public uni_lab_bui::Builder {
public:
AB_Builder(aldous_broder* obj) : Builder(obj){}
void speak() {
this->enclosing->say_hi(); //error because... it makes no sense - it's a nested class that can operate with protected members of aldous_broder, therefore it must be able say hi.
this->say_bye();
}
};
};
當然,我可以讓 aldous_broder 成為 lab_bui 的朋友,一切都解決了,但這沒有任何意義(為什么我應該讓我自己的孫子成為我的朋友,這樣他才能刷牙)另外,我可以嘗試以某種方式重新排序labyrinth 嵌套在 Builder 中,但它也沒有任何意義,因為 builder 只能存在于 labyrinth 中,并且他必須留在它的邊界內。它也不會真正有幫助,因為封閉類肯定無法訪問嵌套的受保護成員。所以,請幫助我完成這項作業,而不破壞封裝。
UPD:剛剛了解問題的原因。隨附的是一個 uni_lab_bui 指標。在任何范圍內(除了 uni_lab_bui 范圍)它都不能用于訪問 lab_bui 受保護的成員。所以現在,我正在尋找解決這個問題的方法。
uj5u.com熱心網友回復:
AB_Builder是 的成員aldous_broder,而不是 的成員uni_lab_bui,因此它無權訪問 s 的受保護成員uni_lab_bui,只是aldous_broders 的成員。
如果您向上enclosing轉換到aldous_broder *,則可以訪問受保護的成員。
class aldous_broder : public uni_lab_bui {
public:
void ult() {
AB_Builder b(this);
b.speak();
}
protected:
size_t field{ 0ull };
class AB_Builder : public uni_lab_bui::Builder {
public:
AB_Builder(aldous_broder* obj) : Builder(obj){}
void speak() {
static_cast<aldous_broder*>(this->enclosing)->say_hi();
this->say_bye();
}
};
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/519734.html
標籤:C 哎呀遗产封装作品
下一篇:解決缺少列舉繼承的問題
