2014-10-06 4 views
0

Я ужасен в шаблонах, как есть. Мне не уделялось много времени. У меня много проблем с получением моей шаблонной программы с двойным соединением для моего класса структур данных. Я, наконец, получил его для компиляции без ошибок один раз, но затем он имел ошибку во время выполнения (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>; поэтому я знаю, что это вызывает конструктор. Помогите, пожалуйста, я очень потерян!

+1

вы инициализируете 'std :: string' (или, возможно,' std :: wstring') с аргументом 0 в качестве аргумента. это неверно. однако он не показан ни в одном из кода, который вы здесь представляете. –

+0

Я понимаю это. Но независимо от того, что я ввел в качестве аргумента для конструктора, он не будет инициализироваться для всех типов. Поэтому моя проблема заключается в том, что я не знаю, как создать «адаптивный» конструктор, который инициализирует заголовок и трейлер «нулевым» значением своего владельца. – UnworthyToast

+0

Думаю, я должен был сказать, что заголовок и трейлер имеют тип DListNode . Я добавлю изменения. – UnworthyToast

ответ

0

Я должен объявить класс DoublyLinkedList выше DListNode , потому что он является другим порядком?

Неправильно. Декларация друга удваивается как объявление вперед в охватывающей области структуры/класса, в которую вы помещаете объявление друга. Итак, следующий пример forward объявляет класс ns::Bar.

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

Значение нуля для заголовка и прицепа равно нуль, поскольку в первой части задания, где я должен был создать программу без шаблона только для списков типа Int, и мой профессор просто сказал нам копировать и вставлять его в новый файл и «преобразовывать» его в шаблонную версию , поэтому я знаю, что она, вероятно, не должна быть равна нулю.

Звучит как разумный подход, за исключением того, что я подозреваю, что у вашего класса списка без шаблонов уже есть проблема. Должно быть возможно создать пустой список, т. Е. Тот, который вообще не содержит узлов.

ошибка я показал выше происходит сразу, когда программа достигает первый конструктор в main.cpp, DLL DoublyLinkedList ;, так что я знаю, что это конструктор, который вызывает эту проблему. Помогите пожалуйста, я очень потерян!

Возможно, вы вызываете конструктор std::string, который принимает const char*. Этот конструктор предполагает, что аргумент указывает на действительную строку символов с нулевым завершающим символом.

Смежные вопросы