Шаблоны. Вложенные классы.
Код:
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;
};
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;
};
Код:
template<typename Key, typename Value>
typename Dictionary<Key, Value>::iterator Dictionary<Key, Value>::iterator::iterator()
{
}
typename Dictionary<Key, Value>::iterator Dictionary<Key, Value>::iterator::iterator()
{
}
Dictionary<Key,Value>::iterator::iterator(){
//тело
}
И при обращении к другим компонентам аналогично расширять область видимости.
Для укорочения этих записей используют typedef
Посмотрите в Солтере стр.245.
И раз у вас шаблонный файл, то в конце заголовочника не забудьте заинклудить файл исходника (такой вот маразм, см. в той-же книге стр.327)
- Конструкторы шаблонных классов (как и методы),
описываютсясчитается хорошим тоном описывать в .h, а не в .c++. - Чтобы присвоить значение полю вложенного класса, необходимо передать значение через конструктор, как это делается обычно.
Код:
#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;
}
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;
}
Не обязательно в .h -- см. ссылку. Но лучше на мой взгляд полностью в заголовочнике. Хотя что чудней выглядит - вопрос.
спасибо! ваше рекомендованная книга ответила на мои вопросы!
А это вообще неплохая книга :)) Удачи.