2017-12-29 1 views
-1

저는 학습 과제로 스택 클래스를 구현하려고합니다. 이건 내 StackNode 클래스, 내가 스택을 만들려면이 노드를 사용C에서 스택 구현

template <typename T> 
class StackNode{ 
public: 
    T data_{}; 
    StackNode<T> next_; 

    StackNode() : data_(nullptr), next_(nullptr){} 
    StackNode(const T& data_) : data_(data_),next_(nullptr) {} 

}; 

이며,이 코드,

template <typename T> 
class Stack{ 
private: 

    StackNode<T> top_; 
    std::size_t size_{}; 

public: 
    Stack() : top_(nullptr), size_ (0){} 
    void push(const T& item){ 
     StackNode<T> p{item}; 
     p.next_ = top_; 
     top_ = p; 
    } 

    T pop(){ 
     StackNode<T> p = top_; 
     top_ = top_.next_; 
     return p; 
    } 

    T peek(){ 
     return top_.data_; 
    } 

}; 

이 호출 클라이언트입니다

Stack<int> stack{}; 
stack.push(12); 
stack.push(13); 
std::cout << stack.peek() << std::endl; 
stack.pop(); 
std::cout << stack.peek() << std::endl; 

내가 얻을입니다 컴파일 오류 다음에

In file included from /Users/mstewart/Dropbox/codespace/private/cpp-drive/data-structures/main.cpp:2: 
In file included from /Users/mstewart/Dropbox/codespace/private/cpp-drive/data-structures/Stack.hpp:5: 
/Users/mstewart/Dropbox/codespace/private/cpp-drive/data-structures/StackNode.h:12:18: error: field has incomplete type 'StackNode<int>' 
    StackNode<T> next_; 
       ^
/Users/mstewart/Dropbox/codespace/private/cpp-drive/data-structures/Stack.hpp:13:18: note: in instantiation of template class 'StackNode<int>' requested here 
    StackNode<T> top_; 
       ^
/Users/mstewart/Dropbox/codespace/private/cpp-drive/data-structures/main.cpp:6:16: note: in instantiation of template class 'Stack<int>' requested here 
    Stack<int> stack{}; 
      ^
/Users/mstewart/Dropbox/codespace/private/cpp-drive/data-structures/StackNode.h:9:7: note: definition of 'StackNode<int>' is not complete until the closing '}' 
class StackNode{ 
    ^

누군가 내가 잘못하고있는 것을 이해하도록 도와 줄 수 있습니까? 나는 C++을 처음 사용합니다.

+9

클래스 인스턴스는 자체 인스턴스를 포함 할 수 없습니다. –

+2

[좋은 초보자 용 책 가져 오기] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) 및 * 포인터 * 및 * 목록 *에 대해 읽으십시오. –

+2

* 학습 수업으로 스택 클래스를 구현하려고합니다 * - 방금'std :: deque'를 멤버로 사용하고 deque의 해당 함수를 'push'로 호출하면 더 나은 행운을 보게 될 것입니다. , 'pop' 등등. – PaulMcKenzie

답변

1

"클래스 인스턴스는 자체 인스턴스를 포함 할 수 없습니다"- Oliver Charlesworth, The Comment Section.

As mentioned elsewhere 클래스는 사용 시점 (컴파일러 오류 메시지의 마지막 줄 참조)에서 완전히 정의되지 않으며 메모리 레이아웃에 문제가 있습니다.

따라서 포인터를 사용하여 배열의 항목을 관리해야합니다. 코드를 비교적 간단하게 조정하는 대신 std::unique_ptr을 사용하십시오 (수동 메모리 관리는 newdelete).

IDEOne link w/ code

당신은 푸시 기능에 new를 사용하여 원시 포인터를 사용하여 수동으로이 문제를 에뮬레이트 수 등, 아래의 노드를 소유 참고 스택 최상위 노드를 소유하는 소유권 의미, 그리고 팝 delete 기능.