C++11でunique_ptrなメンバ変数に対するGetter/Setterの書き方。
class B {
public:
B() {}
~B() {}
};
class A {
public:
const B& GetData() const {
if (!m_data) {
throw std::domain_error("null pointer");
}
return *m_data;
}
void SetData(std::unique_ptr<B>&& new_data) {
m_data = std::move(new_data);
}
private:
std::unique_ptr<B> m_data;
};
int main(void) {
A obj;
std::unique_ptr<B> data1(new B());
obj.SetData(std::move(data1));
const B& b1 = obj.GetData();
return 0;
}
Getterはconst参照で返す。理由は、
- 所有権を渡すわけではない。
m_dataがnullptrの場合は例外投げておく。
Setterは右辺値参照を引数にとり、moveしてメンバ変数に設定する。理由は、
- 引数の型を
unique_ptr<B>
の値渡しにすると、仮引数に渡すときにunique_ptrのムーブコンストラクタが呼ばれるので無駄。