Re: [問題] 標頭檔的問題

看板C_and_CPP (C/C++)作者 (xXx_5354M3_31M0_xXx)時間4年前 (2021/01/18 23:55), 4年前編輯推噓1(107)
留言8則, 3人參與, 4年前最新討論串2/2 (看更多)
namespace glm { struct vec2 { vec2(double x_, double y_):x(x_), y(y_) {} double x; double y; }; } class polygon { public: polygon() {} polygon(std::vector<glm::vec2> vec): vertices(vec) {} std::vector<glm::vec2> vertices; }; 要在 global scope 初始化一個複雜的變數有這些方法 https://en.cppreference.com/w/cpp/language/initialization 我只講你這個例子幾個我自己會用的方法 1. Default initialization https://en.cppreference.com/w/cpp/language/default_initialization polygon cube_global; cube_global.vertices的大小是0 2. List initialization https://en.cppreference.com/w/cpp/language/list_initialization polygon cube_global { std::vector<glm::vec2> { glm::vec2{1.0, 2.0}, glm::vec2{3.0, 4.0} } }; cube_global.vertices的大小是2 這個初始化過程是先找到polygon的建構式 polygon(std::vector<glm::vec2> { glm::vec2{1.0, 2.0}, glm::vec2{3.0, 4.0} }) 然後再找到std::vector<glm::vec2>的建構式 std::vector<glm::vec2>( { glm::vec2{1.0, 2.0}, glm::vec2{3.0, 4.0} } ) 最後找到glm::vec2的建構式 (註:我沒有去找glm的實作,所以先用我上面寫的定義) glm::vec2(double x_, double y_) 3. Direct initialization https://en.cppreference.com/w/cpp/language/direct_initialization polygon cube_global ( std::vector<glm::vec2>( 5, glm::vec2(1.0,1.0)) ); cube_global.vertices的大小是5 這很直觀,就是呼叫什麼建構式就做什麼事 4. 使用函式進行Copy initialization(?) https://en.cppreference.com/w/cpp/language/copy_initialization static inline polygon polygon_factory() { std::vector<glm::vec2> vec2_vector; for(int i=0;i<1250;i++) { vec2_vector.push_back(glm::vec2(i,i)); } return polygon(vec2_vector); } polygon cube_global = polygon_factory(); cube_global.vertices的大小是1250 很特定的物件我會用這個方法 -------------------------------------------------------------- 你會有問題的應該是List initialization的這個,建議你在寫一個邏輯太複雜的物件 不要使用,或是多多研究後再使用 以上有錯請指正 -- https://i.imgur.com/uQyKwdk.png
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.225.184.161 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1610985353.A.CE2.html

01/18 23:56, 4年前 , 1F
呼叫專家寫一個更好的
01/18 23:56, 1F
※ 編輯: nh60211as (36.225.184.161 臺灣), 01/19/2021 08:03:06

01/19 12:14, 4年前 , 2F
有個地方我還是不太懂,為什麼在 global 裡不能用 cubea
01/19 12:14, 2F

01/19 12:15, 4年前 , 3F
指定的方式,但是在 main 裡可以 cube.vertices 指定
01/19 12:15, 3F
我剛剛找了一下網路上的文章看到, https://stackoverflow.com/a/51886355 一個C++程式有declaration(宣告)、 definition(定義)、 statement(陳述)。 你在global可以做的事情只有宣告跟定義,而在你這個例子你想做的事情是定義 polygon cube為某個變數。 而cube.vertices = ... 是一個陳述句所以不能在global scope做。 相關的C++標準我還沒找到。

01/19 12:27, 4年前 , 4F
我還真沒想過,C++標準應該有說。
01/19 12:27, 4F

01/19 12:28, 4年前 , 5F
不過建議你沒有必要不要用global變數,把你要做的事
01/19 12:28, 5F

01/19 12:30, 4年前 , 6F
從程式進入點(main)開始寫程式會有比較清楚的程式流程
01/19 12:30, 6F
※ 編輯: nh60211as (111.251.129.56 臺灣), 01/19/2021 12:50:09 ※ 編輯: nh60211as (111.251.129.56 臺灣), 01/19/2021 12:53:55

01/19 14:37, 4年前 , 7F
[gram.basic], [dcl.pre]/1. 單純語法問題
01/19 14:37, 7F

01/19 15:06, 4年前 , 8F
感謝樓上
01/19 15:06, 8F
文章代碼(AID): #1W1Q-9pY (C_and_CPP)
文章代碼(AID): #1W1Q-9pY (C_and_CPP)