创建一个新对象并传入方法参数 [英] Creating a new object and passing in method parameter
问题描述
在Java中,我们可以在其参数内创建新对象并将其传递给方法,如下所示:
In Java we can create and pass a new object to a method within its parameters like so:
wrapper.set_state( new Medium() );
在C ++中,这等效于什么?我想我可以先创建对象然后再传递它,但是能够在参数中创建它似乎更整洁.
What is the equivalent to this in C++? I suppose I could create the object before and then pass it, but being able to create it in the parameter would seem neater.
推荐答案
在Java中
wrapper.set_state( new Medium() );
创建一个新的,引用计数的Medium实例,并将其通过引用传递给包装器的set_state函数.
creates a new, reference counted, instance of Medium and passes it by reference to wrapper's set_state function.
在C ++中,以上代码在技术上是有效的,在包装器类中,set_state将定义为:
In C++ the above code is technically valid, in your wrapper class set_state would be defined as:
void set_state(Medium* medium);
但是您要做的是将非引用计数指针传递给Medium的新实例.您将负责确保稍后对其进行 delete
删除.如果所有的set_state都是这样:
But what you would be doing is passing a non-reference counted pointer to a new instance of Medium. You would be responsible for ensuring that it is delete
d later. If all set_state did was this:
void set_state(Medium* medium)
{
this->medium = medium;
}
您将在每次第二次调用set_state时引入内存泄漏.在C ++中,当您像这样覆盖原始指针时,没有引用计数.如果没有人再指向该分配,则分配将丢失/泄漏.
you would be introducing a memory leak every time you made a second call to set_state. In C++, when you overwrite a raw pointer like this, there is no reference counting. If nobody is pointing to the allocation any more, the allocation is lost/leaked.
您可能更希望通过引用传递对象:
You might prefer to pass an object by reference:
void set_state(const Medium& medium)
{
this->medium = medium; // copy
}
通过以下方式调用:
Medium m;
// populate m
wrapper.set_state(m);
// or
wrapper.set_state(Medium());
或者您可以按值传递:
void set_state(Medium medium)
{
this->medium = medium; // copy
}
// invocation:
Medium m;
// populate m
wrapper.set_state(m); // copy
尽管这是一个副本,但在某些情况下,编译器可以删除其中一个副本(请参见 http://ideone.com/gNICYt )
Although this is a copy, in some cases the compiler is able to elide out one of the copies (see http://ideone.com/gNICYt)
如果您绝对需要使用指针(某些东西将引用完全相同的Medium实例),则可能需要考虑使用提供参考计数的 std :: shared_ptr
.
If you absolutely need to use a pointer (several things will reference the exact same Medium instance) you might want to consider using std::shared_ptr
which provides reference counting.
#include <memory>
struct Medium {};
class Wrapper {
std::shared_ptr<Medium> medium;
public:
void set_state(std::shared_ptr<Medium> medium) {
this->medium = medium; // if we'd called it m_medium, or medium_
// we could just have written
// m_medium = medium; or medium_ = medium;
}
};
int main(void) {
Wrapper w;
w.set_state(std::make_shared<Medium>());
return 0;
}
这篇关于创建一个新对象并传入方法参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!