【发布时间】:2011-01-01 19:27:23
【问题描述】:
这是用 C++ 编写的。
所以,我从头开始编写游戏引擎,目的是为了获得乐趣并从头开始学习。我想要实现的一个想法是让游戏对象状态(一个结构)被双缓冲。例如,我可以让子系统在渲染线程从旧数据渲染时更新新的游戏对象数据,方法是保证游戏对象中存储的状态一致(上次的数据)。在旧的渲染和新的更新完成后,我可以交换缓冲区并再次执行。
问题是,什么是一种好的前瞻性和通用的 OOP 方式来向我的类公开它,同时尽可能地隐藏实现细节?想知道您的想法和考虑。
我在想可以使用运算符重载,但是如何在我的缓冲区类中为模板类的成员重载分配?
例如,我认为这是我想要的一个例子:
doublebuffer<Vector3> data;
data.x=5; //would write to the member x within the new buffer
int a=data.x; //would read from the old buffer's x member
data.x+=1; //I guess this shouldn't be allowed
如果可能的话,我可以选择启用或禁用双缓冲结构,而无需更改太多代码。
这是我正在考虑的:
template <class T>
class doublebuffer{
T T1;
T T2;
T * current=T1;
T * old=T2;
public:
doublebuffer();
~doublebuffer();
void swap();
operator=()?...
};
游戏对象会是这样的:
struct MyObjectData{
int x;
float afloat;
}
class MyObject: public Node {
doublebuffer<MyObjectData> data;
functions...
}
我现在拥有的是返回指向旧缓冲区和新缓冲区的指针的函数,我猜任何使用它们的类都必须意识到这一点。有没有更好的办法?
【问题讨论】:
-
为了清晰起见进行小改动
-
Gary:运算符重载是一个糟糕的指称选择。您不是在做一个公认的运算符的变体,而是在做一些相当独特的事情。您需要一个记录解决方案唯一性的函数调用。
-
当人们问他们是否应该使用运算符重载时,通常是因为他们有一个非常聪明的想法。真正聪明的想法通常涉及将它们用于明显用途之外的其他用途,这通常意味着无法维护的脆弱代码。因此,通常的答案是“不!!”。 Stroustrup 成功地将
<<和>>用于 I/O 流,但那是很久以前的事了。 -
Gary:我很欣赏你的所作所为,但 operator+() 并不是最好的选择。您没有以任何方式“添加”。
-
@David Thornley - 他是否侥幸逃脱尚有争议;由于过度使用
<<和>>,我避免像瘟疫一样使用iostream。
标签: c++ oop class operators operator-overloading