2つ質問をさせていただきます
①
list構造を理解するために自分で簡易的なコンテナクラスListを作ってみました
以下、完成したコードです
#ifndef INCLUDE_LIST
#define INCLUDE_LIST
#include<iostream>
template<typename T>
class List
{
public:
struct Node
{
T value;
Node* prev;
Node* next;
};
private:
Node m_eol;
public:
List(int how = 0,int value = 0)
{
m_eol.prev = m_eol.next = &m_eol;
int i;
for(i=0;i < how;i++)
{
push_back(value);
}
}
virtual ~List()
{
Clear();
}
void push_back(T value);
void push_front(T value);
void pop_back();
void pop_front();
void front_show();
void back_show();
void Clear();
Node* get_first()const
{
return m_eol.next;
}
Node* get_eol()
{
return &m_eol;
}
};
template<typename T>
void List<T>::push_back(T value)
{
Node* next;
next = new Node;
Node* prev;
prev = m_eol.prev;
prev->next = next;
next->next = &m_eol;
next->prev = prev;
m_eol.prev = next;
next->value = value;
}
template<typename T>
void List<T>::push_front(T value)
{
Node* prev;
prev = new Node;
Node* next;
next = m_eol.next;
next->prev = prev;
prev->next = next;
prev->prev = &m_eol;
m_eol.next = prev;
prev->value = value;
}
template<typename T>
void List<T>::pop_back()
{
Node* node;
node = m_eol.prev;
Node* prev = node->prev;
prev->next = &m_eol;
m_eol.prev = prev;
delete node;
}
template<typename T>
void List<T>::pop_front()
{
Node* node;
node = m_eol.next;
Node* next = node->next;
m_eol.next = next;
next->prev = &m_eol;
delete node;
}
template<typename T>
void List<T>::front_show()
{
Node* node = m_eol.next;
Node* next;
while(node != &m_eol)
{
next = node->next;
std::cout<<node->value<<std::endl;
node = next;
}
}
template<typename T>
void List<T>::back_show()
{
Node* node = m_eol.prev;
Node* prev;
while(node != &m_eol)
{
prev = node->prev;
std::cout<<node->value<<std::endl;
node = prev;
}
}
template<typename T>
void List<T>::Clear()
{
Node* node;
Node* next;
node = m_eol.next;
while(node != &m_eol)
{
next = node->next;
delete node;
node = next;
}
}
#endif
get_first()並びにget_eol()の定義をクラスの外に出して書くと、エラーが出てしまって実行できません
以下エラーの出るコードです
問題の関数はクラスの宣言が終わった後の2つの関数です
#ifndef INCLUDE_LIST
#define INCLUDE_LIST
#include<iostream>
template<typename T>
class List
{
public:
struct Node
{
T value;
Node* prev;
Node* next;
};
private:
Node m_eol;
public:
List(int how = 0,int value = 0)
{
m_eol.prev = m_eol.next = &m_eol;
int i;
for(i=0;i < how;i++)
{
push_back(value);
}
}
virtual ~List()
{
Clear();
}
void push_back(T value);
void push_front(T value);
void pop_back();
void pop_front();
void front_show();
void back_show();
void Clear();
};
template<typename T>
Node* List<T>::get_first()const
{
return m_eol.next;
}
template<typename T>
Node* List<T>:: get_eol()
{
return &m_eol;
}
template<typename T>
void List<T>::push_back(T value)
{
Node* next;
next = new Node;
Node* prev;
prev = m_eol.prev;
prev->next = next;
next->next = &m_eol;
next->prev = prev;
m_eol.prev = next;
next->value = value;
}
template<typename T>
void List<T>::push_front(T value)
{
Node* prev;
prev = new Node;
Node* next;
next = m_eol.next;
next->prev = prev;
prev->next = next;
prev->prev = &m_eol;
m_eol.next = prev;
prev->value = value;
}
template<typename T>
void List<T>::pop_back()
{
Node* node;
node = m_eol.prev;
Node* prev = node->prev;
prev->next = &m_eol;
m_eol.prev = prev;
delete node;
}
template<typename T>
void List<T>::pop_front()
{
Node* node;
node = m_eol.next;
Node* next = node->next;
m_eol.next = next;
next->prev = &m_eol;
delete node;
}
template<typename T>
void List<T>::front_show()
{
Node* node = m_eol.next;
Node* next;
while(node != &m_eol)
{
next = node->next;
std::cout<<node->value<<std::endl;
node = next;
}
}
template<typename T>
void List<T>::back_show()
{
Node* node = m_eol.prev;
Node* prev;
while(node != &m_eol)
{
prev = node->prev;
std::cout<<node->value<<std::endl;
node = prev;
}
}
template<typename T>
void List<T>::Clear()
{
Node* node;
Node* next;
node = m_eol.next;
while(node != &m_eol)
{
next = node->next;
delete node;
node = next;
}
}
#endif
List.h(47): error C2143: 構文エラー : ';' が '*' の前にありません。
という部分です
しかし、確認をしてもしっかりとセミコロンもついており、原因を見つけることができません
念のためにmain関数並びにこのクラスのイテレーターの部分も載せさせていただきます(一番初めのコードで実行できているので関係している可能性は低そうです)
#include"List.h"
#include<iostream>
using namespace std;
typedef List<int>::Node Node;
class Iterator
{
protected:
Node* m_node;
public:
Iterator(Node* node) : m_node(node){}
int operator *()
{
return m_node->value;
}
void operator ++()
{
m_node = m_node->next;
}
void operator ++(int)
{
m_node = m_node->next;
}
void operator --()
{
m_node = m_node->prev;
}
void operator --(int)
{
m_node = m_node->prev;
}
bool operator !=(const Iterator& other)
{
return m_node != other.m_node;
}
};
void Show(Iterator first,Iterator eol)
{
for(Iterator itr = first;itr != eol;itr++)
{
cout<<*itr<<endl;
}
}
int main()
{
List<int> list(3);
list.front_show();
cout<<endl;
list.pop_back();
list.back_show();
cout<<endl;
list.push_front(5);
list.front_show();
cout<<endl;
list.push_back(10);
Show(Iterator(list.get_first()),Iterator(list.get_eol()));
cout<<endl;
return 0;
}
ご回答いただけると嬉しいです
なお、コンパイラはVC++ 2010を使用しております
②
同時進行でSTLについても学習を進めているのですが、
例えば、座標を記録する構造体もしくはクラスがあるとします これをvectorやlistといったコンテナクラスに入れて使用しようと思った時、 のようにして構造体の中身を使おうとして、
.を打ち込むとvectorのメンバ関数を呼び出すことしかできずに、赤線が出て指摘されます。
自作のクラスや構造体をコンテナクラスに入れた時の自作クラスのほうのメンバの使い方を教えてください
以上です
非常に長くなってしまいました申し訳ございません
ご回答いただけると嬉しいです