[6~作者Lipraxde (靜夜)
看板C_and_CPP
標題[問題] C++物件建構順序
時間Wed Oct 3 00:06:24 2018
編譯器(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。
不過這樣感覺怪怪的,不知道有沒有其他正常的方法?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.56.71
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1538496393.A.11E.html
1F:推 steve1012: 這寫法也太危險了吧lol 10/03 00:17
2F:推 steve1012: 你還想要a是extern 這樣你要怎麼確保 construction ord 10/03 00:23
3F:→ steve1012: er? 一個做法是都傳同一個變數 也就是你的解法 為何奇 10/03 00:23
4F:→ steve1012: 怪呢? 10/03 00:23
5F:推 steve1012: 大多不應該依賴全域變數的建構順序 你大可以在你的main 10/03 00:26
6F:→ steve1012: 安排好順序 10/03 00:26
7F:→ Lipraxde: 我是看llvm command line library蠻潮的,想模仿看看 10/03 01:43
8F:推 jass970991: 沒有人這樣寫程式的 我連建構子裡面都不太想呼叫函數 10/03 09:19
9F:→ jass970991: 了 10/03 09:19
10F:→ jass970991: 盡量讓建構子越單純越好 10/03 09:20
11F:推 chchwy: 不要這樣寫 10/03 11:19
12F:→ MOONY135: 一定要在B建構裡面才能塞給A嗎 10/03 11:45
13F:→ MOONY135: 不能建好B之後 從B裡面丟出A所需要的東西嗎 10/03 11:45
14F:→ Lipraxde: 如果不在 B 的建構子裡面丟給 A 的話,是不是就要使用 10/03 12:05
15F:→ Lipraxde: 者主動丟才行? 10/03 12:05
16F:→ Lipraxde: 我有辦法知道使用者用 B 宣告了那些參數嗎 10/03 12:05
我是有想過在 B 裡面用 static member variable,不過如果我想讓使用者可以用多種型
別,例如:
B<int32_t> o1(456);
B<float> o2(3.14159);
B<string> o3("abc");
的話,我在 A 裡面要處理的話就要先寫好(還是有別的方法?),要用的型別多的話看起來
也是怪怪的...。
如果是這樣:
B<list<int>> o4( ... );
這種要是事前沒寫到的話就...有點麻煩?
※ 編輯: Lipraxde (140.113.210.55), 10/03/2018 12:58:30
17F:→ descent: 可以貼一下 llvm 是怎麼用的嗎? 10/03 21:32
18F:推 thefattiger: 不要把A master插在兩個B中間就好了 10/03 23:57
19F:→ thefattiger: 用master()是標準的Singleton Pattern沒甚麼不好 10/03 23:57
21F:→ Lipraxde: 如果 master 是定義在另一個檔案裡... 10/04 00:27
22F:→ Lipraxde: Singleton Pattern 沒什麼不好的話就這樣吧 10/04 00:29
23F:→ annies5: 讓A去讀B的public變數不就好了? 10/04 10:42
24F:→ Lipraxde: 我會先吧 A 的部分會先編譯成 lib,B 用來給使用者宣告 10/04 11:29
25F:→ Lipraxde: 變數 10/04 11:29