読者です 読者をやめる 読者になる 読者になる

クラスのポインタ

前もちょっと言及したけど、クラスをポインタで宣言することで得られる利点が今日もう一つ分かった。
クラスBの中でクラスAのインスタンスをメンバとして保持することを想定する。

class A
{
  public:
    A(int a);
    virtual ~A();
};

クラスAは上のようにデフォルトコンストラクタを持っていないから、必ず引数付きでインスタンスを生成しないといけない。
でもクラスBのコンストラクタのイニシャライザとしてAのコンストラクタを呼び出すことが不可能な状況があるかもしれない。
例えば、Aをvectorでいくつも持たないといけない場合とか。
そういうときは、クラスAのポインタをメンバで持たせとけばいい。

class B
{
  private:
    std::vector< A* > vectorA_;

  public:
    B(const std::vector< int >& b)
    {
      vectorA_.resize(b.size());
      for (unsigned i = 0; i < b.size(); ++i) { // イテレータでもいい
        vectorA_[i] = new A(b[i]);
      }
    }

    ~B()
    {
      for (unsigned i = 0; i < vectorA_.size(); ++i) {
        delete vectorA_[i];
      }
    }
};

多分こんな感じでエラー出ずにいけた気がする。
こういう使い方今まで読んだ参考書にも載ってなかったから正直正しいのか分からないけど、頭の良い先輩が教えてくれたやり方だからいいのかもしれない。
でも今回は結局Aにコンストラクタとは別に初期化用の関数を作る必要があったから、このやり方は使わなかった。