0
xor 연결 목록에 대한 코드를 작성합니다. 제가 xor 결과로 가능한가요, 잘못된 포인터가 있습니까?
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와 fault.Debugging 세그먼트를 얻을
그 도시 한 함수의 코드 C.link 여기 XOR B.를 = 속성을 이용하여, I 포인터를 얻는 기능을 가지고 이것에 대한 이유가없는 변수 라인return (Node<T>*)((int)prev^(int)curr->np);
같은 값 제 생각에는 XOR
p ((int)prev^(int)curr->np)
$8 = 16
의 끝에서
p *prev
$6 = {data = 2, np = 0x60}
p *curr
$7 = {data = 12, np = 0x804c058}
입니다 유효 포인터이므로 세그먼트 오류가 발생합니다. 어떻게 해결할 수 있습니까? 감사합니다
Тhe 문제는 solved.The 문제는 내가이 2 개 라인을 제거 할당 연산자
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;
}
에 있었고, 문제가 사라입니다.
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;
}
메인 프로그램은 할당 연산자라는 새로운 객체에 기존 객체의 머리와 꼬리 값을 할당했다. 당신이있는 경우
포인터로 펑키 수학을 중단 할 수 있습니다. 당신이 XOR을 int로 강제해야하는 이유가 있습니다 ... : P – cHao
하지만 저는 예를 들어 그렇게했습니다 (int) prev. 네가하는 말은 아니야? –
C++은 두 포인터를 배타 처리하는 것이 실제로 int라고 생각하도록 속이지 않으면 조작을 허용하지 않기 때문에 실제로 xORing 두 포인터가 사용자를 가져올 것이라고 말하지 않습니다. 기껏해야 IB 영역에 있습니다. – cHao