作者nh60211as (xXx_5354M3_31M0_xXx)
看板C_and_CPP
标题Re: [问题] 标头档的问题
时间Mon Jan 18 23:55:34 2021
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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1610985353.A.CE2.html
1F:→ nh60211as: 呼叫专家写一个更好的 01/18 23:56
※ 编辑: nh60211as (36.225.184.161 台湾), 01/19/2021 08:03:06
2F:推 shiburin: 有个地方我还是不太懂,为什麽在 global 里不能用 cubea 01/19 12:14
3F:→ shiburin: 指定的方式,但是在 main 里可以 cube.vertices 指定 01/19 12:15
我刚刚找了一下网路上的文章看到,
https://stackoverflow.com/a/51886355
一个C++程式有declaration(宣告)、
definition(定义)、
statement(陈述)。
你在global可以做的事情只有宣告跟定义,而在你这个例子你想做的事情是定义
polygon cube为某个变数。
而cube.vertices = ... 是一个陈述句所以不能在global scope做。
相关的C++标准我还没找到。
4F:→ nh60211as: 我还真没想过,C++标准应该有说。 01/19 12:27
5F:→ nh60211as: 不过建议你没有必要不要用global变数,把你要做的事 01/19 12:28
6F:→ nh60211as: 从程式进入点(main)开始写程式会有比较清楚的程式流程 01/19 12:30
※ 编辑: nh60211as (111.251.129.56 台湾), 01/19/2021 12:50:09
※ 编辑: nh60211as (111.251.129.56 台湾), 01/19/2021 12:53:55
7F:→ loveme00835: [gram.basic], [dcl.pre]/1. 单纯语法问题 01/19 14:37
8F:→ nh60211as: 感谢楼上 01/19 15:06