面向对象的C ++抽象体系结构

时间:2012-01-22 01:26:50

标签: c++ oop architecture callback sdl

背景资料

我正在上一个计算机图形课。我们学习主要概念的方式是制作一个任何人都可以使用的抽象(也就是一个简单的3D库)。我们将SDL用于真正的图形部分。实际上,我们使用SDL来渲染和操作像素缓冲区。我们只允许使用它。但我们的抽象应该允许客户端绘制像素,线条,三角形等,以完成由这些三角形组成的模型。

事情进展顺利......直到教授看了我的抽象。他说这不是面向对象的。

我的问题

我不太关注我的代码审查,因为我正在寻找一些关于如何使用声音面向对象原则设计这个SDL库的一般性建议和建议。

到目前为止我有什么

我的代码实际上很好地利用了一些面向对象的原则。到目前为止,我有以下对象正常工作:

  • Vec4 - 表示坐标或颜色。它执行与向量相关的操作。
  • Mat4 - 表示我用于转换等的4x4矩阵。操作是否与矩阵相关,例如乘以另一个矩阵,由vec4等等。
  • MatrixFactory - 创建不同类型的Mat4(MatrixTranslate,MatrixRotate等)
  • Shape - 用于简化各种形状绘制的界面
    • 点:形状
    • 线条:形状
    • 三角形:形状

我的“引擎”本身执行以下操作(基于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对象。

任何想法,提示或一般建议?

非常感谢你。我知道这是一个很长的问题......

1 个答案:

答案 0 :(得分:2)

你的回调是普通的旧功能。这就是他们的错。想象一下,你只能拥有没有参数的函数。或者具有fixrmed类型的一个参数的函数。你不会走得那么远。但你的回调就是这样。

您希望能够将函数传递给RegisterXyzEvent()。到时候,你的框架应该用提供的参数调用函数。

在C ++中调用与其(某些)参数捆绑在一起的函数 - 说“绑定函数”或“函数对象”或者有时候是“仿函数”(最后一个是一个非常错误的名称,不幸被卡住了)。您需要了解这些绑定函数如何工作,如何构建它们,如何使用standrd库附带的函数以及如何自行编写。然后让RegisterXyzEvent()接受这样的函数对象,并让你的框架调用它们。

要搜索的一些关键字:function object,boost :: bind,std :: function。

很抱歉没有例子的简短回答。我的手机键盘很无聊,而且我觉得你最好不要在你的oelwn上学习这些东西。