Re: [問題] 使用指標的時機

作者: EricTCartman (阿ㄆㄧㄚˇ)   2019-09-13 00:39:36
※ 引述《PythonScript (Python)》之銘言:
: 以我目前的理解 有錯再請提點
: 有 classA, classB 與 classC
: classB 會產生 classA 的物件, 然後存在 classB 的屬性中
: 接著 classC 會去存取 classB, 也會使用 classB 中存 classA 的屬性
class B : public A
表示 B is an A
屬性一般是指property跟field
B的物件模型會包含A 但這個陳述不代表B可以存取A的所有內容
A對外承諾的"介面" 繼承A的B也同樣要維持相同的承諾
因此如果B物件在同樣的場合無法替代A的行為 會說是違反里氏替換原則
: 如果在 classB 中 classA objectA;
: 未來某個時刻有可能會發生 classC 存取 classB 中存 classA 的屬性時
: 該屬性可能會消失或被取代
class A的東西不會被弄消失 除非是virtual inheritance打從一開始就不存在
class A的介面如果是virtual, derived class可以override
class A的介面如果是non-virtual, derived class可以hide A的method(然而並不建議)
: 如果在 classB 中 classA* objectA = new objectA()
: 就不會有上述描述情況的發生
: 可以這樣理解嗎?
完全無關的兩個問題
: 其次就是 如果有個變數 variableA
: 我有用指標變數 pointerA 指向 variableA
: 這樣 variableA 應該是不會消失 直到我 delete 他
A* ptr = nullptr;
{
A a;
ptr = &a;
}
A& ra = *ptr;
在這個陳述中只有一個問題
variable A的生命週期如何被決定?
上面這段程式碼,對ptr dereference絕對是錯的,因為 a 早就已經解構
delete與destruct是不同的事情
: 那如果有一系列的 variableA 變數指向它們
: 我把它們整理成一個 vectorB
: vectorB = vector<pointerA>
: 如果怕 vectorB 弄丟 那需要再用一個 pointerB 指向 vectorB 嗎?
: 謝謝
同理,
vector<A*>裡面所有的raw pointer指向的物件都是沒有保證的
就像推文裡講的 unique、shared、weak 是你要先搞懂的東西
vectorB若是一堆pointer所組成
除非這個vector的size非常可觀、用戶電腦非常爛
直接複製即可, 80:20法則
總結
1. C++基礎需要加強
2. pointer的對象有可能是無效的
3. pointer不是萬靈丹,shared_ptr亂用只會更慘
作者: PythonScript (Python)   2019-09-13 06:16:00
拍謝 下一篇有貼 sample code

Links booklink

Contact Us: admin [ a t ] ucptt.com