C ++中的堆栈实现

问题描述 投票:-1回答:1

我正在尝试实现一个堆栈类作为学习练习。这是我的StackNode类,

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

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

};

我用这个节点创建一个Stack,这是代码,

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 ++的新手

c++
1个回答
1
投票

“一个类实例不能包含它自己的实例” - 评论部分的Oliver Charlesworth。

As mentioned elsewhere,该类在使用时未完全定义(请参阅编译器错误消息中的最后一行),并且存在内存布局问题。

因此,您需要使用指针来管理数组中的项目。对代码进行一次相对简单的调整就是使用std::unique_ptr(避免使用newdelete进行手动内存管理)。

IDEOne link w/ code

注意所有权语义,其中堆栈拥有顶级节点,该顶级节点拥有下面的节点,等等。您可以使用push函数中的new和pop函数中的delete手动使用原始指针来模拟它。

© www.soinside.com 2019 - 2024. All rights reserved.