***
一.クラステンプレート
クラステンプレートがインスタンス化された後のオブジェクトをテンプレートクラスと呼ぶ
1.クラステンプレート定義、クラステンプレート内のメンバー関数定義の場合、外部で定義されている場合は、クラステンプレートの説明を追加する必要があります.
2.クラステンプレートによる簡単なarrayコンテナ(コンテナの概念は後述するが、静的配列、定義時にタイプを指定する)
3.クラステンプレートには複数のタイプが含まれています
4.クラステンプレートによるArray配列の実現
クラステンプレートが関数パラメータとして使用される場合、関数のパラメータはクラステンプレートまたはクラステンプレートの参照であり、対応するインスタンスはそのクラステンプレートがインスタンス化されたテンプレートクラスオブジェクトである
二.クラステンプレートの継承、クラス階層の特徴
クラステンプレートは継承時に明確なタイプでなければなりません
1.クラステンプレートは、テンプレートクラスから派生できます.
2.テンプレートクラスは、非テンプレートクラスから派生してもよい.
3.非テンプレートクラスはテンプレートクラスから派生し、テンプレートクラスはインスタンス化、転送タイプが必要である.
4.テンプレートクラスに虚関数を含めることができます.
クラステンプレートがインスタンス化された後のオブジェクトをテンプレートクラスと呼ぶ
1.クラステンプレート定義、クラステンプレート内のメンバー関数定義の場合、外部で定義されている場合は、クラステンプレートの説明を追加する必要があります.
#include
#include
using namespace std;
//
template
T add(T a, T b)
{
return a + b;
}
//
template
class com
{
public:
T a;
T b;
T add()
{
cout << typeid(T).name() << endl;
return a + b;
}
};
void main2()
{
com c1;
c1.a = 10;
c1.b = 20;
cout << c1.add() << endl;
com ff;
vector my;//
my.push_back(10);
cin.get();
}
void main1()
{
int sum;
float ff;
sum=add(1,2);
ff = add(1.1, 2.0);
cout <
2.クラステンプレートによる簡単なarrayコンテナ(コンテナの概念は後述するが、静的配列、定義時にタイプを指定する)
#pragma once
#include
template
//
//template myarray<> my;
class myarry
{
public:
myarry();
~myarry();
};
#include
#include "myarry.h"
#include
#include
using namespace std;
template
myarry::myarry()
{
cout << " " << typeid(T).name() << endl;
}
template
myarry::~myarry()
{
}
void main()
{
myarry my1;
}
void main5()
{
array strarry = {"calc","notepad"};
for (auto i : strarry)
{
cout << i.c_str() << endl;
}
cin.get();
}
3.クラステンプレートには複数のタイプが含まれています
#include
#include
using namespace std;
template
class myclass
{
public:
T1 a;
T2 b;
myclass(T1 c,T2 d):a(c),b(d)
{
}
void print()
{
cout << a << ' '<< b << endl;
}
};
void main3()
{
myclass my(10,20.8);
my.print();
myclass my1(10, "123456789");
my1.print();
cin.get();
}
4.クラステンプレートによるArray配列の実現
クラステンプレートが関数パラメータとして使用される場合、関数のパラメータはクラステンプレートまたはクラステンプレートの参照であり、対応するインスタンスはそのクラステンプレートがインスタンス化されたテンプレートクラスオブジェクトである
#pragma once
template //
class Array
{
public:
Array();
//Array(int len);
~Array();
int size();//
T get(int num);//
void set(T data, int num);//
T& operator [](int num);//
void print(Array &myarray);
public:
T *p;
//int n;
};
//
#include "Array.h"
#include
#include
using namespace std;
//template
//Array::Array()
//{
// this->p = nullptr;
// //this->n = 0;
//
//}
template//
Array::Array()
{
this->p = new T[n];
//this->n = len;
}
template
Array::~Array()
{
delete[] this->p;
//this->n = 0;
}
template
int Array::size()
{
return n;//this->n ;
}
template
T Array::get(int num)
{
if (num >= n || num < 0)
{
//
T *p(nullptr);
}
else
{
return this->p[num];//*(p+num)
}
}
template
void Array::set(T data,int num)
{
if (num >= n || num < 0)
{
//
T *p(nullptr);
}
else
{
this->p[num] = data;;//*(p+num)
}
}
template
T& Array::operator [](int num)
{
if (num >= n || num < 0)
{
//
T *p(nullptr);
}
else
{
return this->p[num];//*(p+num)
}
}
template
void print(Array &myarray)//
{
for (int i = 0;i < myarray.size();i++)
{
myarray.set("hi", i);
//cout << myarray.get(i) << endl;
cout << myarray[i] << endl;
}
}
void main()
{
Array myarray;
print(myarray);
cin.get();
}
void main1()
{
Array myarray;
for (int i = 0;i < myarray.size();i++)
{
myarray.set("hi", i);
//cout << myarray.get(i) << endl;
cout << myarray[i]<< endl;
}
cin.get();
}
二.クラステンプレートの継承、クラス階層の特徴
クラステンプレートは継承時に明確なタイプでなければなりません
1.クラステンプレートは、テンプレートクラスから派生できます.
2.テンプレートクラスは、非テンプレートクラスから派生してもよい.
3.非テンプレートクラスはテンプレートクラスから派生し、テンプレートクラスはインスタンス化、転送タイプが必要である.
4.テンプレートクラスに虚関数を含めることができます.
#include
#include
using namespace std;
class A
{
public:
//virtual void print() final //
void print() //override
{
cout << "A
";
}
virtual void run()
{
}
};
class B:public A
{
public:
void run() override// override
{
}
void print()
{
cout << "B
";
}
};
//
template
class C
{
public:
T x;
C(T t) :x(t)
{
}
void print()
{
cout << x<
class D :public C
{
public:
T y;
D(T t1, T t2) :C(t1), y(t2)
{
}
void print()
{
cout < dd("aaa","ggggg");
C *p = new D(1,2);
p->run();//
cin.get();
}
void main2()
{
D d1("hello", "world");
d1.print();
cin.get();
}
void main1()
{
B b1;
b1.print();
cin.get();
}
//
class xyz
{
public:
int x;
int y;
int z;
xyz()
{
x = y = z = 0;
}
void print()
{
cout << x << ' ' << y << ' ' << z << endl;
}
};
template
class E :public xyz
{
public:
T a;
E(T t1) :a(t1)
{
}
void print()
{
cout << "a=" <// タイプ
{
public:
int ff=0;
F(int a, int b) :E(a), ff(b)
{
}
void print()
{
cout << ff << endl;
cout << "a=" << a << endl;
cout << x << ' ' << y << ' ' << z << endl;
}
};
void main4()
{
F f(1,2);
f.print();
cin.get();
}
void main3()
{
E e1("hahahhaha");
e1.print();
cin.get();
}