2013-02-10 2 views
-1

먼저 링크 된 목록의 복사본 생성자를 만드는 것이 어려웠습니다. 나는 거의 무언가로 머리를 치고 싶었지만 Stack Overflow 친구들을 생각했다. 그래서 여기에 문제가있다 : 한 가지 고려 사항 list.h 또는 stack.h 또는 그 생성자를 변경할 수 없다. list.h링크 된 목록을 사용하여 스택의 생성자 복사

template <class T> 
struct ListItem 
{ 
    T value; 
    ListItem<T> *next; 
    ListItem<T> *prev; 

    ListItem(T theVal) 
    { 
     this->value = theVal; 
     this->next = NULL; 
     this->prev = NULL; 
    } 
}; 

/* This is the generic List class */ 
template <class T> 
class List 
{ 
    ListItem<T> *head; 

public: 

    // Constructor 
    List(); 

    // Copy Constructor 
    List(const List<T>& otherList); 

} 
// In list.cpp 

template <class T> 
List<T>::List() 
{ 
    head=NULL; 
} 

template <class T> 
List<T>::List(const List<T>& otherList) 
{ 
// I have code working for this part   
} 

template <class T> 
List<T>::~List() 
{ 
} 
// In stack.h (includes list.cpp) 

template <class T> 
class Stack 
{ 
    List<T> list; 

public: 

    Stack(); 

    Stack(const Stack<T>& otherStack); 

    ~Stack(); 

    void push(T item); 
    T top(); 
    T pop(); 
}; 
// remember top(); pop(); push() functions are working properly in stack.cpp file. 
// In stack.cpp (includes stack.h) 

    Stack(const Stack<T>& otherStack){ 
    } 
template <class T> 
void Stack<T>::push(T item) 
{ 
} 

template <class T> 
T Stack<T>::top() 
{ 
} 

template <class T> 
T Stack<T>::pop() 
{ 
} 

에서 // 0 위에 인 (100) (100)로부터 오브젝트의 함유 ELEM있다.

Stack<int> s2(s); 

나는 지구에 otherStack 요소에 액세스하는 방법을 모른다 -이 : 이제 우리는 다음과 같이 복사합니다. 나는 물론 그것의 연결된 목록을 의미합니다. 하지만 그것은 Stack.cpp에 있습니다. 어떻게 접근 할 수 있습니까? 또한이 스택을위한 복사 생성자를 만드는 법도 있습니다 (Working 코드가 더 좋을 것입니다). 이번에는지지 해주십시오. 감사. 참고 : 생성자는 변경할 수 없습니다. 그것이 그 길이어야합니다. 이번에는 모든 시체가 내 질문을 받기를 바랍니다.

+1

'List'의 복사 구조가 올바르게 작동하면, 암시 적으로 생성 된 복사 생성자가'stack'에 대해 정상적으로 작동해야합니다.'List' 만 포함합니다.이리스트는'List (List const &)'. –

+0

@JerryCoffin 다음과 같은 의미입니다 : - list.List Stack (otherStack) //이 기능이 작동하지 않습니다. 오류 : -> 기능의 부적절한 사용. – CerebralGarcon

+0

아니요. 그는 스택 복사 생성자 선언 및 구현을 삭제 한 다음 다른 객체처럼 스택을 다른 스택으로 복사하는 것을 의미합니다. –

답변

2

List의 복사 생성자가 올바르게 작동한다고 가정하면 Stack은 컴파일러에서 암시 적으로 생성 한 복사본 생성자를 사용하여 문제가 없어야합니다. 우리는 목록의 복사 생성자가 data 멤버를 복사 할 수 있기 때문에, 스택의 복사 생성자를 정의 할 필요가 없습니다

template <class T> 
class Stack { 
    List<T> data; 
public: 
    void push(T d) { data.add(data.begin(), d); } 
    T front() { assert(!data.empty()); return data.front(); } 
    void pop() { asset(!data.empty()); data.delete(data.begin()); } 
}; 

(: 케이스가되는 것은, 스택의 전체 코드는 다음과 같이 보일 수 그것이 유일한 데이터 멤버 인 Stack이기 때문에 복사하는 것만으로도 Stack을 복사하는 것으로 충분합니다.

+0

고마워요 ............... – CerebralGarcon

+0

그냥 복사 생성자를 스택에 써야 할 경우가 있습니다. 어떻게 진행할까요? 링크 복사 생성자가 없다고 가정합니다. – CerebralGarcon

+0

@CerebralGarcon : 짧고 올바른 답변은 :하지 마세요. –