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型