컴공 일기56
게시글 주소: https://orbi.kr/00057028567
이건 아직 해결이 도대체 되지 않은 문제입니다. double linked list는 잘 구현해놨는데, 왜 Iterator 부분에서 원하는 대로 데이터가 안 뽑히는지…… 내일 12시 시험인데 9시즘 일어나서 1시간 정도 더 고민해보려고요... 구현 잘 됐는데, 왜 도대체 왜 안 되는 거냐고!
왜! 왜! 왜! 컴파일러씨 억까 자제좀요 ㅠㅠㅠ
#include <iostream>
#include <vector>
using namespace std;
class CShape{
protected:
int x,y;
public:
CShape(int a, int b) : x(a), y(b) {}
virtual void Print() = 0;
};
template <typename T>
class CCircle : public CShape{
private:
T Radius;
public:
CCircle(int a, int b, T r) : CShape(a,b), Radius(r) {}
double GetArea() { return 3.14 * Radius * Radius; }
void Print() { cout << this->GetArea() << endl;}
template <typename U>
friend ostream& operator << (ostream& out, CCircle<U>& rhs);
};
template <typename U>
ostream& operator << (ostream& out, CCircle<U> rhs){
cout << rhs.GetArea() << endl;
return out;
}
template <typename T>
struct Node{
T data;
Node<T> *next;
Node<T> *prev;
Node(T d, Node<T> *n = NULL ) : data(d), next(NULL), prev(NULL) { }
};
template <typename T>
class ListIterator{
private:
Node<T>* ptr;
public:
ListIterator(Node<T> *p=0) : ptr(p) {}
void operator++ (int) { ptr = ptr->next;}
void operator-- (int) { ptr = ptr->prev;}
Node<T>* operator&(){
return ptr;
}
T &operator* () { return ptr->data;}
ListIterator<T> operator+ (int adv)
{
while (adv > 0)
{
ptr = ptr-> next;
adv--;
}
return *this;
}
void operator=(Node<T> *p)
{
ptr = p;
}
};
template <typename T>
class MyList {
private :
Node<T> *start;
Node<T> *last;
public:
MyList() : start(NULL), last(NULL) {}
typedef ListIterator<T> iterator;
Node<T> *begin() {return start;}
Node<T> *rbegin() {return last;}
void push(T d) {
Node<T> *temp = new Node<T> (d, NULL);
if (start == NULL) {
start = last = temp;
}
else
{
temp -> prev = last;
last -> next = temp;
last = temp;
}
}
void insert(iterator iter, T d) {
Node<T> *now = &iter;
Node<T> *prevnode = now->prev;
Node<T> *newnode = new Node<T>(d);
prevnode->next = newnode;
newnode->prev = prevnode;
newnode->next = now;
now->prev= newnode;
if(now == start) start = newnode;
}
};
int main()
{
int i;
MyList<CCircle<double> > intL;
MyList<CCircle<double> >::iterator lIter;
for(i=0; i<5; i++)
{
intL.push(CCircle<double>(1,1, i+ 1.1));
}
lIter = intL.begin();
intL.insert(lIter+2, CCircle<double>(1,1,1.1));
for(i=0; i<6; i++){
cout << *lIter;
lIter++;
}
lIter = intL.rbegin();
for (i=0; i<6; i++){
cout << *lIter;
lIter--;
}
return 0;
}
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.

컴공주님 파이팅..!
교수님께서 이게 시험에 분명 어려운 문제로 나온다고 하셨어요 ㅜㅜㅜ 내일 아침까지 더 고민해봐야겠어요!안녕히 주무세용!
음.. 버그 고치셧나요?
전에 올리던 코드 말인가용?
네네! 원인을 알아냈조 ㅎㅎㅎ
이 코드 ㅇ오류 원인은 operator++,-- 함수 다중 정의 쪽이었어욘
굳굳! 저도 컴공이라 해봤는데 비슷하게 나오네요
근데 이게 segmentaion 메모리 문제도 있어서 손을 다시 보긴 해야할 듯 해요
Ptr = Ptr -> next; 대신 ptr++을 하면 리스트 자료구조 특성상 이상한 주소를 가리키게 되어서 ptr->next 고치면 안 될 듯 한데.. 급한 불은 껐지만 의도대로 코딩은 안 되는 듯 합니다..
저도 다시 고민해서 올려볼게용 포인터 하나 잘못 건드린 듯한 느낌이...
전 이렇게 뜨네요.. 그래서 if(ptr) 넣어봤는데 되긴 돼더라구요
이게 릭은 아닐 테고, 초기화가 안된 상태인가..? 동적 할당 메모리 삭제를 안 해서 그럴까요...? 일단 다른 시험 공부 중이어서 나중에 각잡고 고민해보아야 겠어요...
혹시 코드 공유 가능하세요?-?
모든 NULL을 nullptr로 고친거하고 operator++쪽 수정만 했어요
void operator++ (int) {
if (ptr) {
ptr = ptr->next;
}
}
null로 초기화된 노드는 그냥 data건 next건 아무것도 없고, 이거를 ptr = ptr->next를 하니까 ptr이 null일때 오류가 난거같네요.