簡體   English   中英

從子 class 訪問受保護變量時遇到問題

[英]Trouble accessing protected variables from child class

所以,我正在嘗試使用鏈表作為父級來實現堆棧,並編寫了這兩個類:

template <class T>
class LL {
    public:
        struct Node {
            Node* next = nullptr;
            T data = 0;
        };
        Node* head;
    public:
        LL();
        ~LL();
        void insert(T item);
        void append(T item);
        virtual void disp();
};

template<class T>
LL<T>::LL(){ head = nullptr; }

template<class T>
void LL<T>::insert(T item)
{
    Node* newNode = new Node;
    newNode->data = item;
    
    if (head == nullptr) head = newNode;
    else
    {
        Node* loop = head;
        Node* prev = nullptr;
        while (loop != nullptr && loop->data < item) {
            prev = loop;
            loop = loop->next;
        }

        if (prev == nullptr) { //head
            newNode->next = head;
            head = newNode;
        }
        else { //insert
            newNode->next = prev->next;
            prev->next = newNode;
        }
    }
}

template<class T>
void LL<T>::append(T item)
{
    Node* newNode = new Node;
    newNode->data = item;

    if (head == nullptr) head = newNode;
    else
    {
        Node* loop = head;
        while(loop->next != nullptr)
            loop = loop->next;
        loop->next = newNode;
    }
}

template<class T>
void LL<T>::disp()
{
    cout << "[";

    if (head) {
        if (head->next == nullptr)
            cout << head->data;
        else {
            Node* loop = head;
            while (loop->next != nullptr)
            {
                cout << loop->data << ",";
                loop = loop->next;
            }
            cout << loop->data;
        }
    }

    cout << "]" << endl;
}

template<class T>
LL<T>::~LL()
{
    if (head != nullptr) {
        while (head != nullptr) {
            Node* temp = head;
            head = head->next;
            delete temp;
            temp = nullptr;
        }
    }
}

template<class T>
class stack: public LL<T> {
    private: 
        
    public:
        stack();
        ~stack();
        virtual void push(T item);
        void pop(T ret);
        bool empty();
        void disp();
};

template<class T>
stack<T>::stack():LL<T>()
{
    
}

template<class T>
stack<T>::~stack()
{
}

template<class T>
void stack<T>::push(T item){ this->append(item); }

template<class T>
void stack<T>::pop(T ret)
{
    ret = this->head->data;
    this->head = this->head->next;
}

template<class T>
bool stack<T>::empty() { return false;}

template<class T>
void stack<T>::disp()
{
    Node<T>* loop = this->head;
    cout << "-" << endl;
    while (loop) {
        cout << loop->data << endl;
        loop = loop->next;
    }
    cout << "-";
}

問題出現在最后一個 function,“disp()”,它不允許我訪問 Node 結構。 它給了我錯誤“'節點':找不到標識符”。 這使我無法聲明所需的“循環”變量。 據我所知,Node 結構應該繼承自 LL class 並在堆棧 class 中受到保護。 因此,我應該能夠直接訪問它。

有任何想法嗎?

好的,所以我使用這篇文章解決了這個問題: Declaring a struct in a template class, undefined for member functions

我的 disp() function 現在看起來像這樣:

template<class T>
void stack<T>::disp()
{
    typename LL<T>::Node* loop = this->head;
    cout << "-" << endl;
    while (loop) {
        cout << loop->data << endl;
        loop = loop->next;
    }
    cout << "-";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM