- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 arcsynthesis 的教程来学习现代 3D 图形编程,虽然我理解了其中的大部分内容,但我遇到了作者称之为“复杂管理代码”的障碍,我无法理解这段代码的工作原理:
struct Instance
{
typedef glm::vec3(*OffsetFunc)(float);
OffsetFunc CalcOffset;
glm::mat4 ConstructMatrix(float fElapsedTime)
{
glm::mat4 theMat(1.0f);
theMat[3] = glm::vec4(CalcOffset(fElapsedTime), 1.0f);
return theMat;
}
};
Instance g_instanceList[] =
{
{StationaryOffset},
{OvalOffset},
{BottomCircleOffset},
};
我不太明白函数指针是如何在 g_instanceList[] 的结构中设置的,我不太明白它在语法上是如何工作的,也不知道这个 g_instanceList 在下一段中是如何使用的:
float fElapsedTime = glutGet(GLUT_ELAPSED_TIME) / 1000.0f;
for(int iLoop = 0; iLoop < ARRAY_COUNT(g_instanceList); iLoop++)
{
Instance &currInst = g_instanceList[iLoop];
const glm::mat4 &transformMatrix =
currInst.ConstructMatrix(fElapsedTime);
glUniformMatrix4fv(modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(transformMatrix));
glDrawElements(GL_TRIANGLES, ARRAY_COUNT(indexData), GL_UNSIGNED_SHORT, 0);
}
到此为止,我认为我已经非常熟悉 C++,但这种语法糖对我来说是新的。提前致谢:)
最佳答案
I don't quite get how the function pointer is getting set inside the struct in the g_instanceList[]
Instance
是 an aggregate type .它可能有一个成员函数,但这并不意味着它不是一个聚合。在C++98/03中,聚合类型的对象可以用聚合初始化来初始化:
struct Aggregate
{
int x;
int y;
};
Aggregate agg = { 5, 4 };
assert(4 == agg.y); //Will be true.
结构中的每个成员都用每个单独的值初始化,按照这些成员在结构中声明的顺序。 5 进入 x
,4 进入 y
。
Instance
是一个集合。它只有一个成员。该成员恰好是函数指针类型,但 C++ 不关心;它是一个值,可用于聚合初始化。
C++ 数组也是聚合。所以你可以用聚合初始化来初始化一个数组:
int arr[4] = {3, 45, 9, 81};
C++ 还允许您使用聚合初始化来初始化数组,其中数组的大小由初始化程序确定:
int arr[] = {5, 2};
//arr will have 2 elements.
因此,g_instanceList
是一个数组,因此也是一个聚合体,需要进行聚合体初始化。它的大小将由聚合初始化语法提供的值的数量决定。数组的每个元素也是一个聚合,因此数组的每个元素都可以被聚合初始化。
Instance g_instanceList[] =
{
{StationaryOffset},
{OvalOffset},
{BottomCircleOffset},
};
聚合初始化列表的每个成员本身就是一个聚合初始化,它初始化一个 Instance
对象。 StationaryOffset
和其余的是与Instance
成员的签名相匹配的函数指针。这就是 Instance::CalcOffset
的填充方式。
how this g_instanceList is used in the next segment here
它的使用方式是非常常见的 C++。第一行获取对其中一个 Instance
数组元素的引用。这样做只是为了使代码更短;它不必每次都使用 g_instanceList[iLoop]
来谈论它正在使用的 Instance
。第二行调用了Instance
的成员函数(它本身调用了内部函数指针),将结果存储在一个变量中。
如果您谈论的是 ARRAY_COUNT
,那只是一个方便的宏,可以获取...好吧,数组元素的计数。 C++ 编译器知道 g_instanceList
有多大,所以使用宏让编译器自己计算它。这样,如果 g_instanceList
数组长度发生变化,您不必遍历整个代码库来查找数组长度的每次使用。此外,您永远不必直接说明长度;您可以通过聚合初始化来推断它。
关于c++ - 这个特殊的结构是如何发挥作用的呢? (arcsynthesis现代3D图形编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18117438/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!