[COLOR=#000000][COLOR=#0000BB]template[/COLOR][COLOR=#007700]<[/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]>
class [/COLOR][COLOR=#0000BB]H[/COLOR][COLOR=#007700][/COLOR][COLOR=#007700]
{
}; [/COLOR][/COLOR]
Матрешка классов на С++
1) Реализовать непрерывность наследования из минимум 100 классов в программе на С++. Т.е. есть класс А:А1, А1:А2 .....
2) Реализовать матрешку классов из минимум 100 вложений различных(!) классов. Т.е. есть некоторый класс А, в нем в качестве поля есть класс А1, в А1-А2 и т.д.
В принципе понятно что можно поработать ручками как в первом, ток и во втором случае.
Но это как то непрактично что-ли.....
Реализована на 1ю задачу:
Код:
template<int generation>
class H:H<generation-1>
{
};
class H:H<generation-1>
{
};
Реализовано на 2ю задачу:
Код:
template<int generation>
class G
{
public:
G<generation-1>* previos;
G()
{
std::cout<<generation<<std::endl;
if(generation>0)
{
previos = new G<generation-1>();
}
}
};
class G
{
public:
G<generation-1>* previos;
G()
{
std::cout<<generation<<std::endl;
if(generation>0)
{
previos = new G<generation-1>();
}
}
};
Все бы хорошо.
Но классы не компиляться.
И если в первом случае еще понятна причина, по которой не создается класс(цепочка наследования ограничена 500), а у меня она уходит в -бесконечность и компилятор выводит ошибку.
То вот почему не компилируется класс задачи 2 я если честно не очень понимаю. По идее объявил G<100> и он должен создать 100 вложений, а G<0>.previos = NULL, но компилятор зависает!
Если у кого-нить есть какие-нить идеи как это заставить работать - буду признателен!
PS: Во втором случае также можно обойтись и без new ибо размер объекта вычисляем.
Цитата: Ramon
И тому и другому классу не хватает специализации для последнего элемента в цепочке.
Я вот и надеялся что мне кто-нить подскажет как синтаксически эту специализацию задать!
Цитата: sigmov
Я вот и надеялся что мне кто-нить подскажет как синтаксически эту специализацию задать!
Код:
Цитата: hardcase
Код:
[COLOR=#000000][COLOR=#0000BB]template[/COLOR][COLOR=#007700]<[/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]>
class [/COLOR][COLOR=#0000BB]H[/COLOR][COLOR=#007700][/COLOR][COLOR=#007700]
{
}; [/COLOR][/COLOR]
class [/COLOR][COLOR=#0000BB]H[/COLOR][COLOR=#007700][/COLOR][COLOR=#007700]
{
}; [/COLOR][/COLOR]
Мимо денег.
Код:
template<>
class H<0>
{
};
class H<0>
{
};
PS: А вообще тов. sigmov, вам подсказано было, что нужна специализация класса, оставалось только открыть книжку да прочитать, приложить усилие так сказать.
Цитата: Ramon
Мимо денег.
Угу - уже понял. :o Матчасть шаблонную забыл нафиг..
Спасибо, Green
а где подобное может встретится в реальных проектах? или это чисто студенческая задача, дабы изучить фишки языка?
Цитата: oxotnik333
а где подобное может встретится в реальных проектах? или это чисто студенческая задача, дабы изучить фишки языка?
Что ты подразумеваешь под "подобным"?
Частную специализацию?
Рекурсию классов?
Цитата: oxotnik333
или это чисто студенческая задача, дабы изучить фишки языка?
Это не чисто студенческая задача, а задача, которая позволяет решать другие чисто студенческие задачи. Например:
Код:
#include <iostream>
template<int N>
struct Fact
{
enum {res = N * Fact<N - 1>::res};
};
template <>
struct Fact<0>
{
enum {res = 1};
};
int main()
{
int y = Fact<4>::res;
std::cout << y;
return 0;
}
template<int N>
struct Fact
{
enum {res = N * Fact<N - 1>::res};
};
template <>
struct Fact<0>
{
enum {res = 1};
};
int main()
{
int y = Fact<4>::res;
std::cout << y;
return 0;
}