Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Матрешка классов на С++

842
04 октября 2009 года
sigmov
301 / / 16.09.2008
Задачи существует 2

1) Реализовать непрерывность наследования из минимум 100 классов в программе на С++. Т.е. есть класс А:А1, А1:А2 .....
2) Реализовать матрешку классов из минимум 100 вложений различных(!) классов. Т.е. есть некоторый класс А, в нем в качестве поля есть класс А1, в А1-А2 и т.д.

В принципе понятно что можно поработать ручками как в первом, ток и во втором случае.
Но это как то непрактично что-ли.....

Реализована на 1ю задачу:
 
Код:
template<int generation>
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>();
        }
    }
};


Все бы хорошо.
Но классы не компиляться.

И если в первом случае еще понятна причина, по которой не создается класс(цепочка наследования ограничена 500), а у меня она уходит в -бесконечность и компилятор выводит ошибку.
То вот почему не компилируется класс задачи 2 я если честно не очень понимаю. По идее объявил G<100> и он должен создать 100 вложений, а G<0>.previos = NULL, но компилятор зависает!

Если у кого-нить есть какие-нить идеи как это заставить работать - буду признателен!
260
04 октября 2009 года
Ramon
1.1K / / 16.08.2003
И тому и другому классу не хватает специализации для последнего элемента в цепочке.

PS: Во втором случае также можно обойтись и без new ибо размер объекта вычисляем.
842
04 октября 2009 года
sigmov
301 / / 16.09.2008
Цитата: Ramon
И тому и другому классу не хватает специализации для последнего элемента в цепочке.



Я вот и надеялся что мне кто-нить подскажет как синтаксически эту специализацию задать!

5
04 октября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: sigmov
Я вот и надеялся что мне кто-нить подскажет как синтаксически эту специализацию задать!


 
Код:
[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]
260
04 октября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: 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]



Мимо денег.

 
Код:
template<>
class H<0>
{
};


PS: А вообще тов. sigmov, вам подсказано было, что нужна специализация класса, оставалось только открыть книжку да прочитать, приложить усилие так сказать.
5
04 октября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Ramon
Мимо денег.

Угу - уже понял. :o Матчасть шаблонную забыл нафиг..

3
05 октября 2009 года
Green
4.8K / / 20.01.2000
Было: http://forum.codenet.ru/showthread.php?p=241118
842
05 октября 2009 года
sigmov
301 / / 16.09.2008
Спасибо, Green
11
05 октября 2009 года
oxotnik333
2.9K / / 03.08.2007
а где подобное может встретится в реальных проектах? или это чисто студенческая задача, дабы изучить фишки языка?
3
05 октября 2009 года
Green
4.8K / / 20.01.2000
Цитата: oxotnik333
а где подобное может встретится в реальных проектах? или это чисто студенческая задача, дабы изучить фишки языка?


Что ты подразумеваешь под "подобным"?
Частную специализацию?
Рекурсию классов?

87
05 октября 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: 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;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог