У меня проблемы с тем, что этот код не компилируется. Я реализую стек в виде двусвязного списка. Я не могу заставить мой AddToHead () работать. Более конкретно, программа не будет компилироваться, если я попытаюсь динамически создать объект CharNode. Я думал, что наличие #include "charlist.h" даст программе доступ к классу CharNode, поскольку он находится в charlist.h
Я компилирую с: g ++ -ansi -pedantic -Wall charlist.cxx -o clist
Это ошибка, которую я получаю:
/tmp/ccHzaOmz.o: In function `CharList::AddToHead(char)':
charlist.cxx:(.text+0xe9): undefined reference to `CharNode::CharNode(char, CharNode*, CharNode*)'
collect2: error: ld returned 1 exit status
Я знаю, что неопределенная ссылка означает, что компоновщик не может найти ресурсы CharNode. Я просто не знаю, почему это происходит здесь.
Вот charlist.h
#ifndef __CharList__
#define __CharList__
#include <iostream>
#include <string>
using namespace std;
class CharList;
//CharNode class is clearly here in charlist.h
class CharNode
{
private:
char value;
CharNode* prev;
CharNode* next;
public:
CharNode(char value, CharNode* prev = NULL, CharNode* next = NULL);
friend class CharList;
};
class CharList
{
private:
CharNode* h;
CharNode* t;
public:
CharList();
~CharList();
bool IsEmpty() const;
char GetHead() const; //FUNCTION CAUSING ERROR
char GetTail() const;
void AddToHead(char v);
void AddToTail(char v);
};
#endif //__CharList__
Вот charlist.cxx
#include <iostream>
#include <string>
#include <sstream>
#include <cassert>
#include <stdlib.h>
#include "charlist.h"
using namespace std;
CharList::CharList()
{
h = t = NULL;
}
bool CharList::IsEmpty() const
{
return (h == NULL);
}
//All other member functions excluded for relevancy
void CharList::AddToHead(char v){
CharNode* newHead;
newHead = new CharNode(v); //Why cant I do this? Error Line.
newHead->prev = NULL;
newHead->next = h;
if (IsEmpty()){
t = newHead;
h = newHead;
} else {
h->prev = newHead;
h = newHead;
}
}