[問題] C++物件建構順序

作者: Lipraxde (Lipraxde)   2018-10-03 00:06:24
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
g++
問題(Question):
我有兩個 class A、class B,想要在 B 的建構子裡丟東西給 A。
在宣告成全域變數的時候,有可能會因為 B 先建構好,再 A,導致 A 存的東西被清掉。
舉例來說:
B o1(123);
A master;
B o2(456);
這樣的話,進到 main 裡面後看到的 master 裡面只有 456。
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
https://www.ideone.com/nSYZD8
補充說明(Supplement):
我目前的解決辦法是用這個方式:
class A &master() {
static A _master;
return _master;
}
用 master() 代替 master。
不過這樣感覺怪怪的,不知道有沒有其他正常的方法?
作者: steve1012 (steve)   2018-10-03 00:17:00
這寫法也太危險了吧lol你還想要a是extern 這樣你要怎麼確保 construction order? 一個做法是都傳同一個變數 也就是你的解法 為何奇怪呢?大多不應該依賴全域變數的建構順序 你大可以在你的main安排好順序
作者: Lipraxde (Lipraxde)   2018-10-03 01:43:00
我是看llvm command line library蠻潮的,想模仿看看
作者: jass970991 (半糖綠假面超人)   2018-10-03 09:19:00
沒有人這樣寫程式的 我連建構子裡面都不太想呼叫函數了盡量讓建構子越單純越好
作者: chchwy (mat)   2018-10-03 11:19:00
不要這樣寫
作者: MOONY135 (談無慾)   2018-10-03 11:45:00
一定要在B建構裡面才能塞給A嗎不能建好B之後 從B裡面丟出A所需要的東西嗎
作者: Lipraxde (Lipraxde)   2018-10-03 12:05:00
如果不在 B 的建構子裡面丟給 A 的話,是不是就要使用者主動丟才行?我有辦法知道使用者用 B 宣告了那些參數嗎
作者: descent (「雄辯是銀,沉默是金」)   2018-10-03 21:32:00
可以貼一下 llvm 是怎麼用的嗎?
作者: thefattiger (LT)   2018-10-03 23:57:00
不要把A master插在兩個B中間就好了用master()是標準的Singleton Pattern沒甚麼不好
作者: Lipraxde (Lipraxde)   2018-10-04 00:25:00
https://llvm.org/docs/CommandLine.html如果 master 是定義在另一個檔案裡...Singleton Pattern 沒什麼不好的話就這樣吧
作者: annies5 (念渝)   2018-10-04 10:42:00
讓A去讀B的public變數不就好了?
作者: Lipraxde (Lipraxde)   2018-10-04 11:29:00
我會先吧 A 的部分會先編譯成 lib,B 用來給使用者宣告變數

Links booklink

Contact Us: admin [ a t ] ucptt.com