移动 class 个数据成员 (C++)
move class data members (C++)
我想知道我这样做是否正确。我有一个 class 保存一些数据:
class Foo {
// ...
Type a_;
Type b_;
Type c_;
};
还有一个不同的 class,它做其他事情,但使用 class Foo
构建。所以,我想像这样声明一个 ctor:
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
方法,它将 return 一个 Bar
需要的数据成员的元组,我可以将其传递给 Bar
's演员。我还为 Tuple
创建了一个右值引用,因为 class Foo
的那些数据成员将不再需要,除非通过 class Bar
,那么当我可以移动数据时,为什么还要复制数据呢?
因此,我在 class Foo
中创建了一个 return 和 Tuple
的方法。特别是,我需要一个可以由使用右值引用的 Bar
构造函数使用的对象。以下是正确的吗?
auto Foo::move_data() -> Tuple&& {
return std::move( Tuple(a_, b_, c_) );
}
或者这是完全错误的? (指出任何其他愚蠢的事情也将不胜感激。当然,我遗漏了一些类型定义和其他不必要的细节。)
不,不是。这个:
Tuple&& Foo::move_data() {
return std::move( Tuple(a_, b_, c_) );
}
会将您的元素复制到 Tuple
中,然后 move
复制 Tuple
本身……而不是您的元素。你想要做的是将它们移动到 Tuple
,然后return它的值:
Tuple Foo::move_data() {
return Tuple(std::move(a_), std::move(b_), std::move(c_) );
}
这在很大程度上取决于整体代码,但根据您的问题描述,我的问题是为什么不将 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
)。
我想知道我这样做是否正确。我有一个 class 保存一些数据:
class Foo {
// ...
Type a_;
Type b_;
Type c_;
};
还有一个不同的 class,它做其他事情,但使用 class Foo
构建。所以,我想像这样声明一个 ctor:
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
方法,它将 return 一个 Bar
需要的数据成员的元组,我可以将其传递给 Bar
's演员。我还为 Tuple
创建了一个右值引用,因为 class Foo
的那些数据成员将不再需要,除非通过 class Bar
,那么当我可以移动数据时,为什么还要复制数据呢?
因此,我在 class Foo
中创建了一个 return 和 Tuple
的方法。特别是,我需要一个可以由使用右值引用的 Bar
构造函数使用的对象。以下是正确的吗?
auto Foo::move_data() -> Tuple&& {
return std::move( Tuple(a_, b_, c_) );
}
或者这是完全错误的? (指出任何其他愚蠢的事情也将不胜感激。当然,我遗漏了一些类型定义和其他不必要的细节。)
不,不是。这个:
Tuple&& Foo::move_data() {
return std::move( Tuple(a_, b_, c_) );
}
会将您的元素复制到 Tuple
中,然后 move
复制 Tuple
本身……而不是您的元素。你想要做的是将它们移动到 Tuple
,然后return它的值:
Tuple Foo::move_data() {
return Tuple(std::move(a_), std::move(b_), std::move(c_) );
}
这在很大程度上取决于整体代码,但根据您的问题描述,我的问题是为什么不将 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
)。