Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

クラスのメンバ変数の引数付きのコンストラクタの呼び出し方のメモ

スポンサードリンク


あんまり使わないのでどうやってやるんだっけなメモ。
おまけでスマポ(スマートポインタ)についてもさらっと書いてみました。

クラスのメンバ変数の引数付きのコンストラクタの呼び出し方

メンバイニシャライザ(メンバ初期化子)を使うことで解決

#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のスマートポインタも確かそうだった。