移动类数据成员(C++)

4

我想知道我是否做得正确。我有一个保存一些数据的类:

class Foo {
// ...
  Type a_;
  Type b_;
  Type c_;
};

还有一个不同的类,它执行其他操作,但是使用 class Foo 进行构造。因此,我建议声明一个像这样的构造函数:

class Bar {
  Type a_;
  Type b_;
  Type c_;
  AnotherType A_;
  AnotherType B_;
  // ...
public:
  typedef std::tuple<Type, Type, Type> Tuple;

  Bar(const Tuple&);
  Bar(Tuple&&);
};

我现在需要创建一个名为Foo的方法,它将返回Bar所需的数据成员的元组,我可以将其传递给Bar的构造函数。我还为Tuple创建了一个右值引用,因为class Foo的这些数据成员除了通过class Bar之外不再需要,所以为什么要复制数据,而不是移动它呢?
因此,我在class Foo中创建了可返回Tuple的方法。特别是,我需要一个可以由使用右值引用的Bar构造函数使用的方法。以下内容是否正确?
auto Foo::move_data() -> Tuple&& {
  return std::move( Tuple(a_, b_, c_) );
}

或者这个完全是错的吗?(指出任何其他愚蠢的东西也会受到赞赏。当然,我省略了一些typedef和其他不必要的细节。)

如果FooBar有共同的数据,为什么不将它放在同一个类ABC中,并使用组合将其同时放在FooBar中呢? - Julien Guertault
@JulienGuertault:组合?谷歌一下... - Zorawar
@JulienGuertault:哦,你问为什么要返回元组而不是返回一个class ABC对象?好问题...(啊,我有一个很好的理由:这样我就可以学习和练习使用一些新的C++11花哨东西!) - Zorawar
2个回答

6
不,不是这样的。应该是这样的:

...

Tuple&& Foo::move_data() {
    return std::move( Tuple(a_, b_, c_) );
}

您需要将元素复制到 Tuple 中,然后将 Tuple 本身 move ... 而不是移动元素。您想要的是将它们移动到 Tuple 中,然后通过值返回:

Tuple Foo::move_data() {
    return Tuple(std::move(a_), std::move(b_), std::move(c_) );
}

谢谢。我认为那样做更有意义,但我想我没有按值返回,所以编译器抱怨临时变量。 - Zorawar

0

这高度取决于整体代码,但从您的问题描述中,我的问题是为什么不将a、b和c放在自己的结构中呢?

class Abc {
    Type a_;
    Type b_;
    Type c_;
};

class Foo {
    // ...
    Abc abc_;
    int somethingNotInBar_;
};

class Bar {
    Abc abc_;
    AnotherType A_;
    AnotherType B_;
    // ...
public:
    Bar(const ABC&);
};

一些优点:

  • 它可以免去与元组打交道的麻烦;
  • 它使代码更易于理解(通常更难理解元组的含义,因为过程中名称丢失了);
  • 它使修改更加容易(当你意识到你还需要d或你不再需要b时)。

一个诚实的回答是:我正在即兴编写代码,虽然我已经构建了很多结构,但我后来才意识到我需要在Bar中使用Foo的数据,所以我用元组拼凑了一些东西,而不是为其制作一个适当的类!我可能会向Foo->Bar传输添加更多数据,因此类将更好。谢谢。另一方面,我正在逐渐习惯于std::tuple... - Zorawar
是的,能够快速地调试代码,直到弄清楚它应该是什么样子很重要。不幸的是,C++在这方面缺乏一些灵活性;对语法细节进行修改需要花费时间。 - Julien Guertault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接