簡體   English   中英

模板,朋友類及其構造函數

[英]Templates, friend classes, and their constructors

我對模板非常糟糕。 從來沒有給我太多的指示。 為了讓我的數據結構類正常工作,讓我的模板化雙鏈表程序陷入困境。 我終於讓它一次編譯而沒有錯誤,但是隨后發生了運行時錯誤( what(): basic_string::_S_construct null not valid )並崩潰了。

template<class T> class DoublyLinkedList; 
{...}
template<class T> class DListNode {
    ...
    friend class DoublyLinkedList<T>;
};
template<class T> class DoublyLinkedList {
    ...
    protected: DListNode<T> header, trailer;
    public:
        DoublyLinkedList<T>() : header(0), trailer(0) // constructor
        { header.next = &trailer; trailer.prev = &header; }
        DoublyLinkedList<T>(const DoublyLinkedList<T>& dll); // copy constructor
        ~DoublyLinkedList<T>(); // destructor
    ...
}

我應該聲明DoublyLinkedList上面的類DListNode因為是朋友嗎? header和尾trailer值為零,因為在作業的第一部分中,我必須為int類型的列表創建一個非模板程序,而我的教授只是告訴我們將其復制並粘貼到新文件中並將其“轉換”為模板版本,因此我知道它可能不應該為零。

當程序到達main.cpp中的第一個構造函數DoublyLinkedList<string> dll時,上述錯誤立即發生。 所以我知道是導致該問題的構造函數。 請幫助我很迷路!

我應該在DListNode上面聲明DoublyLinkedList類,因為它是朋友嗎?

錯誤。 朋友聲明在您放置該朋友聲明的struct / class的封閉范圍內還作為向前聲明加倍。 因此,以下示例正向聲明了ns::Bar類。

namespace ns {
class Foo
{
    friend class Bar;
};
} // namespace ns

標頭和尾標的值為零,因為在作業的第一部分中,我必須為int類型的列表創建一個非模板程序,而我的教授只是告訴我們將其復制並粘貼到新文件中並將其“轉換”為模板版本,因此我知道它可能不應該為零。

聽起來像是一種明智的方法,但我懷疑您的非模板列表類已經存在問題。 應該可以創建一個空列表,即一個根本不包含任何節點的列表。

當程序到達main.cpp中的第一個構造函數DoublyLinkedList dll時,我在上面顯示的錯誤就發生了,所以我知道是導致該問題的構造函數。 請幫助我很迷路!

您可能會調用采用const char*std::string構造const char* 此構造函數假定參數指向有效的以null終止的字符串。

暫無
暫無

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

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