创建一个新对象并传入方法参数 [英] Creating a new object and passing in method parameter

查看:125
本文介绍了创建一个新对象并传入方法参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在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 deleted 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆