所以我正在创建一个检测两个精灵之间碰撞的函数,并希望添加两个缓冲区作为可选参数,以填充每个对象碰撞的边的角度。
但是这意味着两个buff参数必须是引用,并且无论何时调用函数都必须存在,并且我不知道有任何方法可以进行默认引用。我该怎么做?
这是实际功能:
bool CheckCollision(T* obj1, T* obj2, float& CollBuff1= new float, float& CollBuff2= new float);
我尝试使用'new'进行默认设置,但它不起作用。
答案 0 :(得分:8)
您可以重载该功能。只需定义第二个包装函数,如下所示:
bool CheckCollision(T *obj1, T *obj2)
{
float dummy1, dummy2;
return CheckCollision(obj1, obj2, dummy1, dummy2);
}
如果你愿意,只为一个浮点数定义第二个。
答案 1 :(得分:4)
使用Boost.Optional,没有指针,也没有样板重载:
bool CheckCollision(
T* obj1, T* obj2,
boost::optional<float&> CollBuff1 = boost::optional<float&>(),
boost::optional<float&> CollBuff2 = boost::optional<float&>()
);
您可以通过执行if (CollBuff1)
来测试您是否获得了参数,然后使用CollBuff1.get()
访问引用(显然是以相同的方式访问另一个引用)。
答案 2 :(得分:1)
另一种(并且非常丑陋)的方法是:
#include <memory>
void test(int a, int& b = *std::auto_ptr<int>(new int())) {
// ...
}
或在你的情况下
#include <memory>
bool CheckCollision(T* obj1, T* obj2,
float& CollBuff1= *std::auto_ptr<float>(new float()),
float& CollBuff2= *std::auto_ptr<float>(new float()));
答案 3 :(得分:1)
尝试为引用参数定义默认值时遇到的基本问题是非const引用无法绑定到临时对象或文字。
void foo(float &f = 1.0f) {} // doesn't compile
void foo(const float &f = 1) {} // OK
实际上这是合法的:
void foo(float &f = *(new float(1))) {}
但这是不可取的。函数中的代码无法判断是否使用默认参数调用它,因此您为自己创建了一个相当令人不愉快的资源处理问题:谁将要delete
浮动,以及将会是什么在调用者 传递某些内容的情况下,该代码是做什么的? bdonlan的超载是可取的。
答案 4 :(得分:0)
@James McNellis现在删除(为什么?)答案指出了正确的解决方案:你没有。
使用指针,因为这些缓冲区显然是out-parameters(即,它们用于“返回”其他值)并相应地调用它:
bool CheckCollision(T* obj1, T* obj2, float* ColBuf1 = 0, float* ColBuf2 = 0){
// your code...
// ...
// test before assigning:
if(ColBuf1 != 0)
*ColBuf1 = /*whatever you have*/;
// same with ColBuf2
}
float ColBuf1, ColBuf2;
CheckCollision(SomeObjPtr, AnotherObjPtr, &ColBuf1, &ColBuf2);
或者,甚至更好,超载它:
bool CheckCollision(T* obj1, T* obj2);
bool CheckCollision(T* obj1, T* obj2, float* ColBuf1, float* ColBuf2);
虽然我仍然使用指针来指示那些缓冲区将被填充。