面向对象的C++抽象体系结构
Object Oriented C++ Abstraction Architecture
背景信息
我现在正在上计算机图形学课。我们学习主要概念的方式是制作一个任何人都可以使用的抽象(也就是一个简单的3D库)。我们将SDL用于实际图形部分。实际上,我们使用SDL的目的只是渲染和操作像素缓冲区。我们只能使用它。但我们的抽象应该允许客户端一直绘制像素、直线、三角形等,以完成由这些三角形组成的模型。
事情进展得很顺利。。。直到教授看了我的抽象。他说这不是很面向对象。
我的问题
我不是在寻找对我的代码的审查,而是在寻找一些关于如何使用健全的面向对象原则设计这个SDL库的一般建议和建议。
到目前为止我有什么
我的代码实际上很好地利用了一些面向对象的原则。到目前为止,我有以下对象运行良好:
- Vec4-表示坐标或颜色。它执行与向量相关的操作
- Mat4-表示一个4x4矩阵,我用它来进行变换等等。执行与矩阵相关的运算,例如与另一个矩阵相乘、与vec4相乘等
- MatrixFactory-创建不同类型的Mat4(MatrixTranslate、MatrixRotate等)
- 形状-用于简化绘制各种形状的界面
- 点:形状
- 线条:形状
- 三角形:形状
我的"引擎"本身执行以下操作(在某种程度上基于three.js结构):
- 创建一个窗口(绘制内容的主窗口)
- 创建场景(在其中显示形状)
- 根据键盘事件(按键)注册回调函数
我在哪里特别挣扎
到目前为止,我最头疼的事情就是处理回调。例如,为了画一个三角形,我目前做的事情如下:
int main()
{
// Create instance of my library
RDL* rdl = new RDL(WIDTH, HEIGHT, 32);
// Draw a triangle when T is pressed
// RDL_KEY_t = #define RDL_KEY_t SDLK_t for consistency
rdl->registerKeyEvent(RDL_KEY_t, drawTriangle);
rdl->show();
return 0;
}
// X, Y, Z and R, G, B are random values not shown for simplicity
void drawTriangle(RDL* rdl)
{
RDL_Point p1(Vec4(X, Y, Z), Vec4(R, G, B));
RDL_Point p2(Vec4(X, Y, Z), Vec4(R, G, B));
RDL_Point p3(Vec4(X, Y, Z), Vec4(R, G, B));
rdl->insertShape(RDL_Triangle(pt1, pt2, pt3));
}
在RDL::show()中,我运行标准SDL循环,在其中我做两件事:
- 调用任何已注册的回调
- 在存储所有形状的矢量中绘制形状
但这是不好的。如果我插入10个三角形,它们都画得很好。但如果我想旋转一个特定的对象,我就不能这样做,因为我的回调只允许我从main访问RDL对象。
有什么想法、建议或一般建议吗?
非常感谢。我知道这是一个很长的问题。。。
您的回调是简单的旧函数。这就是他们的问题所在。想象一下,你只能拥有没有参数的函数。或者具有一个固定格式类型的参数的函数。你不会做得太过分。但你的回电就是这样。
您希望能够将函数及其参数传递给RegisterXyzEvent()
。时机成熟时,您的框架应该使用提供的参数来调用函数。
与(一些)参数绑定的函数在C++中被称为"绑定函数"或"函数对象",有时也称为"函子"(最后一个是一个非常错误的名称,不幸地被卡住了)。您需要学习这些绑定函数是如何工作的,如何构建它们,如何使用standsrd库附带的函数,以及如何推出自己的函数。然后让RegisterXyzEvent()
接受这样的函数对象,并让您的框架调用它们。
一些关键词要搜索:函数对象,boost::绑定,std::函数。
很抱歉没有举例的简短回答。我的手机键盘很烦人,我想你最好还是在网上学习这些东西。
- vscode g++链路故障:体系结构x86_64的未定义符号
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 让编译器告诉什么确切的纯虚拟方法使结构抽象?
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 体系结构x86_64的未定义符号:链接器错误
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 未使用的 asm() 在不受支持的体系结构上的行为
- 用于本地网络运行的客户端服务器体系结构
- 生成文件:体系结构x86_64的未定义符号
- Xcode"体系结构x86_64的未定义符号"
- 有了memory_order_relaxed,原子变量的总修改顺序如何在典型体系结构上得到保证
- 体系结构x86_64的未定义符号:找不到原因
- 在OSx:ld上使用CMake构建C++项目:找不到体系结构x86_64的符号
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- 以编程方式在运行时检测 CPU 体系结构
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- 了解类型特征的体系结构
- 面向对象的C++抽象体系结构