Возможность метапрограммирования в c++ позволяет расширить тривиальные способы композиции классов, варьируя сцепленность и зависимость объектов.
Ниже приведены пять вариантов композиции в c++.
(-) сильная зависимость
class A
{
public:
void doSmthing(){
b.method();
}
private:
B b;
};
class A protected B
{
public:
void doSmthing(){
this->method();
}
};class A
{
public:
A(AbstractB *b) : b(b) {};
void doSmthing(){
b->method();
}
private:
AbstractB* b;
};template <class B>
class A
{
public:
void doSmthing(){
b.method();
}
private:
B b;
};
template <class B>
class A : protected B
{
public:
void doSmthing(){
b.method();
}
};class A меняет тип в зависимости от композицииtemplate <class B>
class A
{
public:
A(B* b) : b(b){};
void doSmthing(){
b->method();
}
private:
B* b;
};class AbstractA
{
public:
void doSmthing() = 0;
};
template <class B>
class A : public AbstractA
{
public:
A(B* b) : b(b){};
void doSmthing(){
b->method();
}
private:
B* b;
};