[英]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.