Android Studioのファイルツリーで開かれているファイルにフォーカスされるようにする
salmoncode
TechTopic
こんにちは!エンジニアのサーモンです。
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を作る方法