忍者ブログ

えいりあす

値クラスの設計ミス unique_ptr編

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

値クラスの設計ミス unique_ptr編

C++のstd::unique_ptrを使った時に
moveメソッドがうまくコンパイルできなかったので
色々とメモしておきます。


ポインタを扱うときに自分でnewやdeleteはしないほうがいいよと
最近、いろいろなところで目にします。
その辺りの処理はオブジェクトに任せるべきらしい。

ではどうするかと考えた時に、unique_ptrがどうやらよさげ
所有権の移譲も簡単にできるし!と思ったら躓きました

namespace TestClass
{
 class TestClass
 {
 public:
  TestClass();
  explicit TestClass(const TestClass&); // コピーコンストラクタ有効
  TestClass& operator=(const TestClass&); // コピー演算子有効
 private:
  std::unique_ptr<T> unique_;
 }
}

TestClass::TestClass::TestClass(const TestClass& tc)
{
 unique_ = std::move(tc.unique_); // これがやりたい
}

上のようにstd::moveしようとするとADL(引数依存ルックアップ)でどうやら
std::unique_ptrが属する名前空間のoperator=が呼び出されてるっぽいようなエラー。。。
(ちなみにunique_ptrのoperator=はprivateです)

あれこれ考えてた結果!

引数のconstなくしたらstd::move使えました()笑

TestClass::TestClass::TestClass(TestClass& tc)
{
 unique_ = std::move(tc.unique_); // でけた!
}

考えてみたら所有権を移譲しようとしてるので当たり前ですね。
このクラスは値クラスにしようと思ってたのですが、完全な設計ミス・・・

拍手[0回]

コメント

プロフィール

HN:
忘れ傘
性別:
男性
自己紹介:
Linux初心者
知識が浅すぎるので勉強中
あっぷろーだ:wasuregasa
ついったー:@__TIMESTAMP__

P R

最新コメント

[03/27 NONAME]
[03/26 ぽん]
[03/26 ぽん]
[03/17 ぽん]
[03/05 通りすがりのR]