C++のクラス定義を復習する

C++のクラス定義を復習する。

クラス定義の基本形。

class Foo
{
};

内部クラス。クラス定義の中に他のクラスを定義できる。
Javaと違い、外部クラスとの関連はない。

class Outer
{
public:
  class Inner
  {
  public:
    void say()
    {
      std::puts("Hello");
    }
  }:
};

Outer::Inner c;
c.say();

内部クラスによく似たもので、無名クラス。
C言語の無名構造体のC++版。

class Outer
{
public:
  class
  {
  public:
    void say()
    {
      std::puts("Hello");
    };
  } inner;
};

Outer c;
c.inner.say();

クラスは関数内でも定義できる。

int main(int argc, char* argv[])
{
  class Outer
  {
  };
  Outer o;
  return 0;
}

おなじみテンプレートクラス。

template<class T>
class Foo
{
public:
  T data;
};

Foo<int> foo;
foo.data = 1; //dataはint型。

テンプレートには、型パラメータの他に、非型パラメータも定義できる。
非型パラメータはint、short、charなどの整数値か列挙型が使える。

template<class T, int size>
class Foo
{
  T data[size];
};

Foo<int, 10> foo;

内部クラスにもテンプレートを使用できる。

class Outer
{
public:
  template<class T>
  class Inner
  {
  public:
    T data;
  };
};

Outer::Inner<int> c;
c.data = 1; //dataはint型

外部クラスのテンプレートは、内部クラスにも有効。

template<class T>
class Outer
{
public:
  class Inner
  {
  public:
    T data;
  };
};

Outer<int>::Inner c;
c.data = 1; //dataはint型

これを使うと、コンパイル時に内部クラスを一括して設定することができる。

template<class T>
class Outer
{
public:
  class Inner1
  {
    T data;
  };
  class Inner2
  {
    T data;
  };
  class Inner3
  {
    T data;
  };
};

パラメータ化継承。上位クラスをパラメータにすることができる。

template<class SuperClass>
class Foo : public SuperClass
{
};

パラメータ化継承を使うと、柔軟かつ強力なクラス設計ができる。

template<class SuperClass>
class Employee : public SuperClass
{
};

template<class SuperClass>
class Customer : public SuperClass
{
};

template<class SuperClass>
class Shareholder : public SuperClass
{
};

class Person
{
};

Employee<Person> a;
Shareholder<Employee<Person> > b;
Shareholder<Employee<Customer<Person> > > c;

クラスの設計情報をパラメータ化することもできる。

struct ConfigA
{
  typedef int Price;
};

struct ConfigB
{
  typedef double Price;
};

template<class Config>
class Product : public Config
{
public:
  typedef typename Config::Price Price;
  Price price;
};

Product<ConfigA> a;
a.price = 1; //priceはint型
Product<ConfigB> b;
b.price = 2.3; //priceはdouble型

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください