xor 連結リストのコードを書きます。プロパティ C.link = A XOR B を使用してポインタを取得する関数があります。この関数のコードは次のとおりです。
template <class T>
Node<T>* List<T>::get_next(Node<T>* curr, Node<T>* prev)
{
assert(curr != 0);
return (Node<T>*)((int)prev ^ (int)curr->np);
}
しかし、最終的にセグメンテーション違反が発生します。GDB を使用したデバッグでは、この理由はreturn (Node<T>*)((int)prev ^ (int)curr->np);
値などの変数の行にあることが示されています
p *prev
$6 = {data = 2, np = 0x60}
p *curr
$7 = {data = 12, np = 0x804c058}
xorの終わりに
p ((int)prev ^ (int)curr->np)
$8 = 16
私の意見では、有効なポインターがないため、セグメンテーション違反に従います。どうすれば修正できますか?ありがとう
問題は解決されました。問題は代入演算子にありました
template <class T>
List<T>& List<T>::operator=(const List& l)
{
if(this == &l)
{
return *this;
}
delete this->m_head;
delete this->m_tail;
this->m_size = l.m_size;
this->m_head = new Node<T>(l.m_head->data);
this->m_tail = new Node<T>(l.m_tail->data);
this->m_head = l.m_head;// problem here
this->m_tail = l.m_tail;// and here
return *this;
}
これらの2行を削除すると、問題はなくなりました。
int main()
{
List<int> l;
l.insertAtBack(5);
l.insertAtBack(4);
l.insertAtBack(8);
l.insertAtBack(9);
l.insertAtBack(2);
l.insertAtBack(12);
List <int> i;
i = l;
i.insertAtBack(19);
l.insertAtBack(21);
i.traverse();
l.traverse();
if(i == l)
{
std::cout << "Objects is equal :)" << std::endl;
}
else
{
std::cout << "Objects is not equal :)" << std::endl;
}
return 0;
}
メイン プログラムは代入演算子と呼ばれ、古いオブジェクトの先頭と末尾の値を新しいオブジェクトに割り当てます。