我正在尝试在我拥有的某些对象周围创建一些边界框。
我像这样创建它们:
struct boundingBox{
float top;
float bottom;
float left;
float right;
};
我在设置他们的价值时遇到了问题。我有这个函数,我希望能设置它们的值:
void makeBoundingBox(boundingBox bound, float t, float b, float l, float r){
bound.top =t;
bound.bottom =b;
bound.left=l;
bound.right=r;
}
我试图像这样设置它们:
makeBoundingBox(car,b_Size,b_Size,b_Size,b_Size); //where car is a boundingBox object and b_Size is a calculated box size
当我使用上面的行时,没有设置值;我知道这是因为我打印到控制台检查值,他们总是回来0
。但是,如果我在同一个函数中使用makeBoundingBox
,我会手动设置car.top = 500
并打印,car.top
已成功设置为500并且有效...
makeBoundingBox
方法是否通过传递struct对象无法正常工作?
答案 0 :(得分:1)
您按值传递boundingBox
,而不是按引用传递。这意味着makeBoundingBox
函数在本地副本上运行,并且更改不会传播回原始对象。
按如下方式更改您的功能定义:
void makeBoundingBox(boundingBox& bound, float t, float b, float l, float r)
答案 1 :(得分:1)
您正在通过VALUE将结构传递给函数,您需要通过REFERENCE传递:
void makeBoundingBox(boundingBox &bound, float t, float b, float l, float r){
bound.top =t;
bound.bottom =b;
bound.left=l;
bound.right=r;
}
注意&通过引用传递。
在你的函数调用中,执行相同的操作。在变量名称前面。
答案 2 :(得分:1)
您按值传递了该框。对于更改实际参数的例程,将其通过引用传递 。即。
void makeBoundingBox(boundingBox& bound, float t, float b, float l, float r){
bound.top =t;
bound.bottom =b;
bound.left=l;
bound.right=r;
}
然而,在C ++ 11中,只需编写
即可boundingBox{ 1, 1, 10, 10 }
当您需要boundingBox
这些值时。
在C ++ 03中,您可以为boundingBox
类定义构造函数。
在您最喜爱的C ++教科书中阅读。
以下是一个示例类定义:
struct boundingBox{
float top;
float bottom;
float left;
float right;
boundingBox( float a_top, float a_bottom, float a_left, float a_right )
: top( a_top ), bottom( a_bottom )
, left( a_left ), right( a_right )
{}
};
然后您可以创建一个像
这样的实例boundingBox( 1, 1, 10, 10 )
作为一般观察,使用float
而不是double
可能会产生一些问题(尤其是使用C ++ 11花括号初始化),它的精度低于double
,并且没有什么特别的优势,除非你需要数以万计的价值,如几十亿。
因此,请使用 double
。
这是C ++中的默认浮点类型,例如它是3.14
的类型。