私のコードが現在設定されている方法では、セグメンテーション違反と一時オブジェクトへのポインターの作成のどちらかを選択する必要があると感じています。コードは以下のとおりです。
#include <memory>
#include <cstddef>
#include <iostream>
template <typename T> class Node;
template <typename T> class List {
public:
typedef std::size_t size_type;
typedef T value_type;
typedef T& reference;
typedef const T& const_reference;
class iterator {
public:
iterator() {
isNull = true;
}
iterator(const T val) {
isNull = false;
data = val;
prev = this;
next = &iterator(); #PROBLEMATIC LINE
}
iterator operator++() {
if(this->next->isNull)
return iterator();
iterator old_it = *this;
this->prev = &old_it;
this->next = this->next->next;
this->data = this->next->data;
return *this;
}
T& operator*() {
return data;
}
iterator* next;
iterator* prev;
T data;
bool isNull;
};
List() {
_begin = iterator();
_end = _begin;
}
List(size_type n, T val) {
_begin = iterator(val);
_end = *(_begin.next);
_end.prev = &_begin;
}
void push_back(T val) {
iterator temp = iterator();
_end.data = val;
_end.next = &temp;
temp.prev = &_end;
_end = temp;
}
iterator begin() {return _begin;}
iterator end() {return _end;}
private:
iterator _begin;
iterator _end;
};
int main() {
List<int> derp= List<int>(3,3);
List<int>::iterator i = derp.begin();
std::cout << *i;
derp.push_back(4);
std::cout << i.data;
++i;
std::cout << *i;
}
上記は、一時変数のアドレスを取得します。問題のある行をから変更すると
next = &iterator();
に
*next = iterator();
コードでセグメンテーション違反が発生しますが、その理由はわかりません。どんな助けでも大歓迎です。たまたま気付く可能性のあるコードの重大な欠陥と同様に。