【问题标题】:Templates, friend classes, and their constructors模板、友元类及其构造函数
【发布时间】:2014-10-06 04:05:01
【问题描述】:

我不擅长模板。从来没有给我太多的指导。我在让我的数据结构类的模板化双向链表程序工作时遇到了很多麻烦。我终于让它编译一次没有错误,但随后它出现了运行时错误(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
    ...
}

我应该在DListNode 上方声明DoublyLinkedList 类,因为它是朋友,对吧? headertrailer 的零值为零,因为在作业的第一部分,我必须为 int 类型的列表创建一个非模板程序,而我的教授刚刚告诉我们复制和将其粘贴到一个新文件中并将其“转换”为模板版本,所以我知道它可能不应该为零。

我上面显示的错误发生在程序到达 main.cpp 中的第一个构造函数DoublyLinkedList&lt;string&gt; dll 时;所以我知道是构造函数导致了这个问题。请帮忙,我很迷茫!

【问题讨论】:

  • 您正在使用 0 作为参数初始化 std::string(或者可能是 std::wstring)。那是无效的。但是,到目前为止,您在此处展示的任何代码中都没有显示它。
  • 我意识到这一点。但无论我作为构造函数的参数输入什么,它都不会为所有类型初始化。所以我的问题是我不知道如何制作一个“自适应”构造函数,将标头和预告片初始化为其所有者类型的“null”值。
  • 我想我应该说页眉和拖车的类型是 DListNode。我将添加一个编辑。
  • @UnworthyToast:使用值初始化 T() 对原始类型和默认构造类类型进行零初始化。
  • @MikeSeymour: 如DoublyLinkedList&lt;T&gt;(): header(T()), trailer(T())?

标签: c++ templates constructor


【解决方案1】:

我应该在 DListNode 上方声明 DoublyLinkedList 类 因为是朋友吧?

错了。在放置友元声明的结构/类的封闭范围内,友元声明兼作前向声明。所以下面的例子forward声明了类ns::Bar

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

头部和尾部的零值是零,因为在 作业的第一部分,我必须创建一个非模板 仅针对 int 类型列表的程序,我的教授刚刚告诉我们 将其复制并粘贴到新文件中并将其“转换”为模板 版本,所以我知道它可能不应该是零。

听起来是一种明智的方法,但我怀疑您的非模板列表类已经有问题。应该可以创建一个空列表,即一个根本不包含节点的列表。

我上面显示的错误发生在程序到达 main.cpp 中的第一个构造函数,DoublyLinkedList dll;,所以我 知道是构造函数导致了这个问题。请帮忙 我是 很迷茫!

您可能会调用采用const char*std::string 构造函数。此构造函数假定参数指向一个有效的以空字符结尾的字符串。

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 2011-02-18
    • 2011-07-15
    • 1970-01-01
    • 2011-08-03
    • 2016-10-19
    • 2013-09-18
    相关资源
    最近更新 更多