Не удается инициализировать объект внутреннего класса С++

65
8

У меня есть 2 класса, один вложенный внутри другого:

class List {
private:
class Node {
public:
Token data;
Node* next;
Node(const Token &dataItem, Node* nextptr);
};
Node* first;
int length;
public:
List();
virtual ~List();
void insert (const Token &t);
Node* lookup(const Token &t) const;
};

У узла класса есть конструктор:

List::Node::Node(const Token &dataItem, Node* nextptr): data(dataItem) {
data = dataItem;
next = nextptr;
}

Но когда я пытаюсь инициализировать один из узлов в методе insert, вот так:

void List::insert (const Token &t){
if(first == NULL){
Node* node = new Node(t, nullptr); //PROGRAM DIES HERE
first = node;
cout<<"hey"<<endl;
}else{
Node* isHere = lookup(t);
//if not
if(isHere == NULL){
Node* temp = first;
Node* node = new Node(t, NULL);
while(true){
if((temp->data.getName().compare(t.getName())>0)or(temp->next==NULL)){
Node* temp2 = temp->next;
temp->next = node;
node->next = temp2;
break;
}
temp=temp->next;
}
}
//if node exists
else{
cout<<"node exists"<<endl;
isHere->data.newEntry(t.getLines()[0]);
cout<<"node out"<<endl;

}
}
}

Метод поиска:

List::Node* List::lookup(const Token &t) const{
if(first == NULL)
return first;
if(first->data.isEquivalent(t))
return first;
cout<<"finished coparre"<<endl;

Node* temp = first;
while(temp->next != NULL){
cout<<"in da loop"<<endl;
temp = temp->next;
if(temp->data.isEquivalent(t))
return temp;
}
return NULL;
}

Программа просто тихо умирает в строке, которую я прокомментировал. Что я делаю неправильно здесь? Хорошо, вот токен. Я не думаю, что там есть проблема, но она также была запрошена, поэтому вот источник: Заголовок токена:

class Token {
std::string name; // token name
int frequency;//frequency
Vector lines;//lines where the token is present

public:
//explanations for the methods in the Token.cpp
Token(std::string tokenname, int linenumber);
virtual ~Token();
void newEntry(int &linenumber);
Vector getLines() const;
std::string getName() const;
int getFrequency() const;
const bool isEquivalent(const Token &t);

;

Методы токена:

Token::Token(string tokenname, int linenumber) {
// TODO Auto-generated constructor stub
name = tokenname;
frequency=1;
lines.push_back(linenumber);
}
void Token::newEntry(int &linenumber){
cout<< "enter new entry"<<endl;

frequency++;
lines.push_back(linenumber);
cout<< "finish new entry"<<endl;

}

std::string Token::getName() const{
return name;
}

const bool Token::isEquivalent(const Token &t){
if(t.getName().compare(name)==0)
return true;
else
return false;
}

Vector Token::getLines() const{
return lines;
}

спросил(а) 2021-01-19T15:53:10+03:00 9 месяцев назад
1
Решение
112

В конструкторе произошла ошибка:

List::Node::Node(const Token &dataItem, Node* nextptr): data(dataItem) {
data = dataItem;
next = nextptr;
}

Нам также нужно передать указатель, чтобы он работал правильно

List::Node::Node(const Token &dataItem, Node* nextptr): data(dataItem), next(nextptr){}

ответил(а) 2021-01-19T15:53:10+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема