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