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

Ваш аккаунт

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

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

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

Реализация класса итератора в .cpp

279
05 сентября 2006 года
bave
456 / / 07.03.2004
Допустим есть некий - CList<T> самого его я объявляю в .hpp файле,
а реализацию всех его методов делаю в .cpp файле
и в нём же создаю список CList<CModel> g_Models. - это всё прекрасно
работало, пока не понадобилось добавить итератор...
Т.е. добавил в СList вложенный класс class iterator и вот у него то реализацию методов не получается заганошить в .cpp файл...
т. е. вот к примеру:
Если так (в этом случае всё работает нормально):
Код:
//.hpp
template <class T>
class CList
{
    friend class iterator;
public:
    CList(CList<T> *pPrev);
    ~CList();
//.... - объявление всяких других методов CList
    class iterator
    {
        friend class CList;
    public:
//реализация внутри класса
        iterator() { m_pPosition = NULL; }
        ~iterator() { ... }
        T* operator*() { ... }
        void operator++() { ... }
        void operator--() { ... }
        iterator& operator=(CList<T>*) { ... }
    protected:
        CList* m_pPosition;
    };
protected:
//...
};

//.cpp

//реализация методов CList
template <class T> CList<T>:: CList() { и....

//...
CList<CModels> g_models;
CList<CModels>::iterator iModels;


А вот если так:
Код:
//.hpp
template <class T>
class CList
{
    friend class iterator;
public:
    CList(CList<T> *pPrev);
    ~CList();
//.... - объявление всяких других методов CList
    class iterator
    {
        friend class CList;
    public:
        iterator();
        ~iterator();
        T* operator*();
        void operator++();
        void operator--();
        iterator& operator=(CList<T>*);
    protected:
        CList* m_pPosition;
    };
protected:
//...
};

//.cpp

//реализация методов CList
template <class T> CList<T>:: CList() { и....
//и реализация методов итератора тоже здесь:
template <class T> CList<T>:: iterator:: iterator() { и т. д. ....

//...
CList<CModels> g_models;
CList<CModels>::iterator iModels;

В этом случае линковщик начинает орать, что не видит методов итератора...
240
06 сентября 2006 года
aks
2.5K / / 14.07.2006
Щаблонные классы надо реализовывать в том же файле с описанием класса. Иначе линковщик не увидит.
В идеале методы можно реализовывать прямо внктри класса, как например в Java.
279
06 сентября 2006 года
bave
456 / / 07.03.2004
Втом то и дело, что реализацию методов шаблонного класса я успешно
разместиол в .cpp - поскольку и объекты этого класса я создаю тольков этом .cpp, а вот методы вложеннного класса итератора тутда же разместить пачему-то не получается...
--------------------------------------------------------------
Дело в том, что потом всё в .lib компилируется и мне неохота, чтоб
реализация методов итератора осталась в .hpp файле на виду для каждого...
---------------------------------------------------------------
Может как-нибудь то возможно это сделать...
395
06 сентября 2006 года
RelB
367 / / 09.11.2002
[QUOTE=bave]Втом то и дело, что реализацию методов шаблонного класса я успешно
разместиол в .cpp - поскольку и объекты этого класса я создаю тольков этом .cpp, а вот методы вложеннного класса итератора тутда же разместить пачему-то не получается...
--------------------------------------------------------------
Дело в том, что потом всё в .lib компилируется и мне неохота, чтоб
реализация методов итератора осталась в .hpp файле на виду для каждого...
---------------------------------------------------------------
Может как-нибудь то возможно это сделать...[/QUOTE]Почему мало кто понимает как работают шаблоны? Сам шаблон ведь не компелируется, а компелируется инстанциированный шаблон каким либо типом. Т.е. для каждого типа генерируется разный код.
398
06 сентября 2006 года
Alexandoros
630 / / 21.10.2005
Начиная с 2003 студии и шаблоны в спп файлах компиляться, и объектники создаются. Хотя ума не приложу как - может по -умолчанию int'ом заменяют?
3
06 сентября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=Alexandoros]Начиная с 2003 студии и шаблоны в спп файлах компиляться, и объектники создаются.[/QUOTE]
С чего ты это взял?
398
06 сентября 2006 года
Alexandoros
630 / / 21.10.2005
Сам компилил
3
06 сентября 2006 года
Green
4.8K / / 20.01.2000
Ну то, что ты "сам компилил" ещё ничего не значит. :D
398
07 сентября 2006 года
Alexandoros
630 / / 21.10.2005
А что "что-то" значит, если оно значит что чего-то не значит, хотя значит оно не значит что ничего не значит? ;)

Не вериш - попробуй.
395
07 сентября 2006 года
RelB
367 / / 09.11.2002
Я с тобой согласен, компилируется!
Но.... не линкуется :)
3
07 сентября 2006 года
Green
4.8K / / 20.01.2000
Что ты подразумеваешь под словом "компилируется"?
То, что компилятор завершает свою работу без ошибок или получение валидного объектного файла? :D
Так вот совершенно пустой файл точно так же "компилируется" и на выходе получается точно такой же obj файл без какой-либо реализации.

Не вериш - попробуй.
395
07 сентября 2006 года
RelB
367 / / 09.11.2002
[QUOTE=Green]Что ты подразумеваешь под словом "компилируется"?
То, что компилятор завершает свою работу без ошибок или получение валидного объектного файла? :D
Так вот совершенно пустой файл точно так же "компилируется" и на выходе получается точно такой же obj файл без какой-либо реализации.

Не вериш - попробуй.[/QUOTE]Вообще-то это была шутка...
3
07 сентября 2006 года
Green
4.8K / / 20.01.2000
А вот Alexandoros видимо не шутит... :)
398
07 сентября 2006 года
Alexandoros
630 / / 21.10.2005
Ай, с вами совершенно невозможно разговаривать. :D
279
10 сентября 2006 года
bave
456 / / 07.03.2004
Так и в Visual С++ 5.0 - компилируются, но не линкуются...
А вложенные классы не только не линкуется - он даже еще и не
компилируются - собственно поэтому вопрос и задовал...
------------------------------------------------------------------
Вообщем как-то надоело мне париться и я всё запихнул в .hpp-файл -
тепреь нормально...
3
11 сентября 2006 года
Green
4.8K / / 20.01.2000
ты пример кода приведи
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог