【问题标题】:Different methods to use a class/struct - C++使用类/结构的不同方法 - C++
【发布时间】:2009-02-25 02:26:20
【问题描述】:
struct Foo
{
    void SayHello()
    {
        std::cout << "Hi, I am Foo";
    }
};

我有上面给出的结构。我在我们的一个代码库中看到过这样的用法。

Foo foo;
{
     foo.SayHello();
}

国际海事组织,它也一样

Foo foo;
foo.SayHello();

或者第一种方法有什么优势/区别?

有什么想法吗?

【问题讨论】:

    标签: c++ methods


    【解决方案1】:

    在这种特殊情况下,它看起来很奇怪,并且像是要审查的候选人。在其他情况下可能有用:

    Foo foo;
    {
        ReturnValue v = foo.SayHello();
        Send(v);
    }
    ...
    

    它将限制v 的范围。一种常见的用途是使其中的对象更早地销毁。在构造函数和析构函数中执行特殊操作的类可以在大括号内使用:

    Foo foo;
    {
        MutexLocker locker(sendMutex);
        ReturnValue v = foo.SayHello();
        Send(v);
    }
    ...
    

    在该示例中,发送队列的锁将在发送v 时被持有,并在锁在右括号处被销毁时被释放。

    【讨论】:

    • 这很有意义。谢谢 litb。
    【解决方案2】:

    这两个例子没有区别。但是,以下内容会在大括号范围内创建和销毁 foo 对象:

    {
        Foo foo;
        foo.SayHello();
    }
    

    这对于遵循RAII 习惯用法的对象很有用。

    【讨论】:

      【解决方案3】:

      你是不是说你的第一个选择是

      {
        Foo foo;
        foo.SayHello();
      }
      

      这样会更有意义,因为 foo 对象是在包装它的花括号的较小范围内创建、使用和销毁的。这是一种旨在减少瞬态事物生命周期的常见做法。通常,这些子块可以重构为单独的功能。

      【讨论】:

        【解决方案4】:

        与书面相同(据我所知)。

        正如其他人所说,该构造通常用于限制某事的范围,但在您的示例中,没有区别。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-29
          相关资源
          最近更新 更多