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

Ваш аккаунт

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

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

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

Шаблоны. Вложенные классы.

88K
22 мая 2013 года
sep_tem_ber
2 / / 22.05.2013
Привет всем! пожалуйста объясните как правильно описать конструктор вложенного класса в .cpp и доступ к переменной (чтобы присвоить переменной pm_key NULL) вложенного класса ?


Код:
template<typename Key, typename Value>
class Dictionary
{
public:
    Dictionary();
    Dictionary(Key key, Value value);
    Dictionary(const Dictionary<Key, Value>& aDictionary);
    ~Dictionary();
    Dictionary<Key, Value>& operator =(const Dictionary<Key, Value>& aDictionary);

    int value_size(Key key);
    int key_size() const;

    void value_push_front(Key key, Value value);
    void value_insert(Key key, Value value, int index);
    void value_push_back(Key key, Value value);

    void value_pop_front(Key key);
    void value_remove(Key key, int index);
    void value_pop_back(Key key);

    void key_push_front(Key key);
    void key_insert(Key key, int index);
    void key_push_back(Key key);

    void key_pop_front();
    void key_remove(int index);
    void key_pop_back();

    void value_show(Key key, void visit(Value));
    void key_show(void visit(Key)) const;
private:
    struct Node_size
    {
        int count;
        Node_size* next;
    };
    struct Node_value
    {
        Value value;
        Node_value* next;
    };
    struct Node_key
    {
        Key key;
        Node_value* v_head, *v_tail;
        Node_size* s_head;
        Node_key* next;
    };
    Node_key* pm_head_key, *pm_tail_key;
    int m_size_key;

    Node_key* find_key(Key key);
    void all_remove_value(Node_key*& key);
    void copy(Node_key*& new_key, Node_key*& new_tail, const Dictionary<Key, Value>& aDictionary);
public:
    class iterator
    {
    public:
        iterator();
        iterator(Node_key* key);
    private:
        Node_key* pm_key;
    };
private:
    iterator m_iter_key;
};
вот описан конструктор iterator

 
Код:
template<typename Key, typename Value>
typename Dictionary<Key, Value>::iterator Dictionary<Key, Value>::iterator::iterator()
{

}
но почему то компилятор ругается...как это исправить ?
326
22 мая 2013 года
sadovoya
757 / / 19.11.2005
Если я правильно понял вопрос, то вам надо просто делать длиннющее обращение типа:

Dictionary<Key,Value>::iterator::iterator(){
//тело
}

И при обращении к другим компонентам аналогично расширять область видимости.
Для укорочения этих записей используют typedef

Посмотрите в Солтере стр.245.
И раз у вас шаблонный файл, то в конце заголовочника не забудьте заинклудить файл исходника (такой вот маразм, см. в той-же книге стр.327)
414
22 мая 2013 года
CassandraDied
763 / / 24.05.2012
  1. Конструкторы шаблонных классов (как и методы), описываются считается хорошим тоном описывать в .h, а не в .c++.
  2. Чтобы присвоить значение полю вложенного класса, необходимо передать значение через конструктор, как это делается обычно.
Небольшой пример:

Код:
#include <iostream>
template <typename T>
class A
{
    public:
        A(T x) {
            _b = new B(x);
        }
        T getVal(){
            return _b->val();
        }
 
    public:
        class B
        {
            public:
            B(T v) {
                _val = v;
            }
            T val(){
               return _val;
            }
           
            private:
            T _val;
        };
       
    private:
    B* _b;
};
int main(){
    A<int> a(5);
    std::cout << a.getVal();
    return 0;
}
326
22 мая 2013 года
sadovoya
757 / / 19.11.2005
Не обязательно в .h -- см. ссылку. Но лучше на мой взгляд полностью в заголовочнике. Хотя что чудней выглядит - вопрос.
88K
22 мая 2013 года
sep_tem_ber
2 / / 22.05.2013
спасибо! ваше рекомендованная книга ответила на мои вопросы!
326
22 мая 2013 года
sadovoya
757 / / 19.11.2005
А это вообще неплохая книга :)) Удачи.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог