2012-07-12 27 views
3

我来自一个C#的世界正在做这样的事情是允许的。当我在C++中尝试它时,我没有得到编译器错误,但我不确定它实际上正在工作。C++声明一个变量时,将它传递给一个函数

所以更有经验的人是你允许做这样的事情:

Entity->SetPosition(Vector2(200, 400)); 

由于在Vector2是一个类和设置位置参数需要一个载体?这是允许还是我需要预先初始化变量,像这样:

Vector2 aVector(200, 400); 
Entity->SetPosition(aVector); 

感谢 大卫

回答

8
Entity->SetPosition(Vector2(200, 400)); 

是罚款(和最好)如果你定义SetPosition为一体以下情况:

void SetPosition(Vector2 const & v); //Okay : const reference 
void SetPosition(Vector2 v);  //okay : value 

即,SetPosition接受参数作为const参考,或者简单地作为

这不会工作,虽然:

void SetPosition(Vector2 & v); //not okay : non-const reference 

-

在C++ 11,你可以只写这个(前提是你已经实现Vector2enable this behavior

Entity->SetPosition({200, 400}); 

感谢@Simon指出了这一点。

+1

我相信,在C++ 11你的情况'将能够做'Entity-> SetPosition({200,400});'提供这不会造成歧义。 – Simon 2012-07-12 09:25:32

+0

我回来了。它不起作用。我可能需要阅读更多关于C++ 11的内容。 – Simon 2012-07-12 09:34:14

+0

@Simon:如果你实现了'Vector2'来启用这个行为,它应该可以工作。看到这个演示:http://ideone.com/tbQZF – Nawaz 2012-07-12 10:13:32

1

一般来说,这是很好的。通常,C++中的Set样式API将取值为const &或设置值。在这两种情况下,使用内联表达式都可以。

class Entity { 
public: 
    void SetPosition(const Vector2& value) { ... } 
    void SetPosition(Vector2 value) { ... } 
}; 

这是不合法的,虽然在SetPosition只需参考

void SetPosition(Vector2& value) { ... } 

这不是制定者的习惯用法虽然

+0

我可以问什么更值得推荐? – Constan7ine 2012-07-12 06:55:39

+0

@DavidC尽可能使用'const&'版本。它通常**通过引用传递效率更高,而'const&'阻止接收器修改值。尽管有一些对象,特别是那些不是“const”的对象,可能需要让它接受一个简单的值 – JaredPar 2012-07-12 06:57:09

+1

@JaredPar当传递一个临时对象时,如本例中,通过值和传递之间可能没有区别引用。如果被调用的函数实际需要它自己的副本(它会修改),那么通过引用可能会更昂贵。由于各种历史原因,通过const引用传递类类型的惯例,以及其他类型的价值似乎无处不在,以至于其他任何事情都会引起注意。但是对于现代编译器,我不会在性能方面读得太多。 – 2012-07-12 07:19:31

相关问题