課題解決Tips

【C++】 friendクラスからunique_ptrを作る方法

salmoncode
記事内に商品プロモーション(Amazonアソシエイト含む)を含む場合があります。

こんにちは!エンジニアのサーモンです。

C++でテストを書いているとき、privateなメソッドにアクセスするためにfriendクラスを利用することがあります。

例えば、以下のような感じですね。

class Dog {
public:
  Dog(std::string name) : name_(name) {};
  friend class DogTest;

private:
  std::string name_;
}

DogTestの方では、Dogのprivateプロパティにアクセスすることができます。

class DogTest {
public:
  DogTest() {
    dog_ = new Dog("pochi");
  }

private:
  void SetDefaultName() {
    dog_.name_ = "siro"; // privateなプロパティにアクセスできる
  }

  Dog dog_;
}

このように、テスト時に事前条件を与えたい場合などにfriendクラスは便利です。

しかし、friendクラスからは、コンストラクタに引数を持つクラスのunique_ptrを作成することができません。

No matching constructor for initialization of 'std::unique_ptr‘というエラーになってしまいます。

DogTest() {
  // error: No matching constructor for initialization of 'std::unique_ptr<Dog>'
  dog_ = std::make_unique<Dog>("pochi");
}

// (省略)

std::unique_ptr<Dog> dog_;

この場合は、std::unique_ptrのコンストラクタに初期化済みのインスタンスを渡すことで解決できます。

DogTest() {
  dog_ = std::unique_ptr<Dog>(new Dog("pochi"));
}

// (省略)

std::unique_ptr<Dog> dog_;

シンプルなテクニックですが、ちょっとハマったのでメモ書きとして残しておきます。

スポンサーリンク

まとめ

この記事では、以下の内容について解説しました。

friendクラスからunique_ptrを作る方法

参考情報

参考記事

スポンサーリンク
ABOUT ME
サーモン
サーモン
著者(ソフトウェアエンジニア)
情報系大学院を卒業後、ソフトウェアエンジニアとして都内企業に従事。プログラミング歴は10年以上になります。
スポンサーリンク
記事URLをコピーしました