【问题标题】:Instantiating Object in Parameter Arguments Without using "new"在参数参数中实例化对象而不使用“new”
【发布时间】:2016-04-29 18:43:03
【问题描述】:

如果我想在参数参数中创建一个对象的新实例(在 C++ 中),有没有办法在不使用“new”的情况下做到这一点。据我了解,使用“new”关键字意味着我必须处理删除对象(动态分配?)。

例子:

wrapper.set_state( new Medium() );

【问题讨论】:

  • @icbytes 更新了问题。
  • set_state 真的接受指针参数吗?还是只是Medium 类型的参数?

标签: c++ oop object instantiation


【解决方案1】:

只要set_state通过const引用取参数,就可以在调用处构造一个临时值:

void Wrapper::set_state(const & Medium) { ... }

Wrapper wrapper;
wrapper.set_state(Medium());

临时文件的生命周期将跨越set_state

否则,如果set_state 需要一个指针(也许它不应该!),您需要将实例保留在调用之外:

void Wrapper::set_state(Medium*) { ... }

Wrapper wrapper;
{
  // Local block to explicitly manage lifetime of `medium`.
  Medium medium;
  wrapper.set_state(&medium);
}

【讨论】:

    【解决方案2】:

    你可以在栈上创建对象(简单调用CTOR而不用new)->但是方法返回后对象会被“删除”。

    wrapper.set_state( Medium() );

    【讨论】:

    • 我以为 C++ 有一种垃圾回收机制。
    • @MartinRand C++ 没有垃圾收集,但 C++ 有一个对象生命周期的概念,您应该利用 C++ 在这方面的行为以供您自己使用。这就是它具有某些行为的原因:它可以让您的生活更轻松。即使它没有垃圾收集,也不意味着它不管理资源。通过利用值的语义和各种引用,C++11 使您能够走得更远。
    【解决方案3】:

    当您使用“新”时,您会动态创建和对象,这是正确的。 当你使用“new”创建一个对象时,你需要一个指针来“持有”这个对象,你可以通过这个指针访问它。

    在 C++11 中,您有智能指针。如果您使用智能点,则无需担心会删除对象。你可以在 youtube 上找到很好的教程。搜索“博谦”关于智能指针的教程。

    如果您真的喜欢以这种方式创建和对象,您可以尝试创建一个为您创建该对象的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      相关资源
      最近更新 更多