あんまり使わないのでどうやってやるんだっけなメモ。
おまけでスマポ(スマートポインタ)についてもさらっと書いてみました。
クラスのメンバ変数の引数付きのコンストラクタの呼び出し方
メンバイニシャライザ(メンバ初期化子)を使うことで解決
#include <iostream> class Foo { private: int x_; public: explicit Foo(int x) : x_(x) { } void printX() { std::cout << x_ << std::endl; } }; class Bar { private: Foo foo_; public: Bar() : foo_(10) { } Foo getFoo() { return foo_; } }; int main() { Bar bar; bar.getFoo().printX(); return 0; }
継承していて基底クラスを呼び出す時も同様。
ふつうは下記のように書きますね……
とはいえ、普通、STLとかでない限りFoo foo_;
ってやらずにFoo *foo_;
って書きますよね。
#include <iostream> class Foo { private: int x_; public: explicit Foo(int x) : x_(x) { } void printX() { std::cout << x_ << std::endl; } }; class Bar { private: Foo *foo_; public: Bar() : foo_(nullptr) { foo_ = new Foo(10); } ~Bar() { if (foo_ != nullptr) delete foo_; } Foo* getFoo() { return foo_; } }; int main() { Bar *bar = new Bar(); bar->getFoo()->printX(); return 0; }
だから使用頻度は低い……。
っと、生ポじゃないですか!!
というわけでC++11も出ているのでスマポを使って書き換え
#include <iostream> #include <memory> class Foo { private: int x_; public: explicit Foo(int x) : x_(x) { } void printX() { std::cout << x_ << std::endl; } }; class Bar { private: std::shared_ptr<Foo> foo_; public: Bar() { foo_ = std::make_shared<Foo>(10); } std::shared_ptr<Foo> getFoo() { return foo_; } }; int main() { std::shared_ptr<Bar> bar = std::make_shared<Bar>(); bar->getFoo()->printX(); // 演算子に注意 return 0; }
スマポの場合はアロー演算子なんですね。
たぶん演算子オーバーロードされているんでしょう。
COMのスマートポインタも確かそうだった。