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

作者: nh60211as   2021-01-18 23:55:34
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
很特定的物件我會用這個方法
作者: nh60211as   2021-01-18 23:56:00
呼叫專家寫一個更好的
作者: shiburin (廢文製造機)   2021-01-19 12:14:00
有個地方我還是不太懂,為什麼在 global 裡不能用 cubea指定的方式,但是在 main 裡可以 cube.vertices 指定
作者: nh60211as   2021-01-19 12:27:00
我還真沒想過,C++標準應該有說。不過建議你沒有必要不要用global變數,把你要做的事從程式進入點(main)開始寫程式會有比較清楚的程式流程
作者: loveme00835 (髮箍)   2021-01-19 14:37:00
[gram.basic], [dcl.pre]/1. 單純語法問題
作者: nh60211as   2021-01-19 15:06:00
感謝樓上

Links booklink

Contact Us: admin [ a t ] ucptt.com