Встреча с несколькими ошибками «Выражение должно иметь указатель на тип класса». C ++, используя Visual Studio 2010 - PullRequest
0 голосов
/ 13 марта 2012

Первый постер здесь, и очень начинающий программист на С ++ (текущий 3-й семестр, работающий с языком), и у меня возникли некоторые проблемы. После поисков по форуму и поиска по форуму я не смог найти решение - любая помощь, которую вы могли бы предложить, была бы полезна.

1-й заголовочный файл:

linked_list.h

#ifndef  my_linked_list
#define my_linked_list

#include "Node.h"
#include <cstdlib>

namespace linked_list_version_0{

class linked_list {

public:

linked_list() {head = NULL; tail = NULL;}
~linked_list();

void insert_back (int x);
void insert_front (int x);
int remove_front ();
int remove_back();
bool empty() {return (head == NULL);}

private:

node * head;
node * tail;

}; //end class linked_list
}//end namespace linked_list_version_0

#endif

Файл реализации:

linked_list.cpp

#include "stdafx.h"
#include "Node.h"
#include "linked_list.h"
#include <iostream>

using namespace node_version_0;
using namespace linked_list_version_0;

void linked_list::insert_front (int x) {

node *p = new node;
p->set_data (x);
p->set_next (head);
head = p;
if (head->next() == NULL) tail = head;  // takes care of inserting into the empty list
} //end insert_front

int linked_list::remove_front() {
// assumes the list is not empty

node *p = head;
int x =  p-> get_data(); //could not use data(), had to use get_data
head = head->next() ;
delete p;
if (head==NULL) tail = NULL;  // takes care of deleting only element in the list
return x;
}//end remove_front

linked_list::~linked_list() {

node * p;
while (head != NULL) {
   p=head;
head = head->next();
delete p;
}
tail = NULL;
}//deconstructor

void linked_list::insert_back (int x) {
node * q = new node;
q->set_data(x);
q->set_next(NULL);
if (tail == NULL) head = q; else tail -> set_next(q);
tail = q;
} //end insert_back

int linked_list::remove_back () {
// assumes the list isn’t empty

node *q = tail;
int x= tail->data();
if (head == tail)
{head = NULL; tail = NULL;}
else {
tail = head;
while (tail->next()!=q)
 tail = tail->next();
}
delete q;
tail->set_next(NULL);
return x;
} //end remove back

2-й заголовочный файл

node.h

#ifndef my_node
#define my_node

#include "linked_list.h"

//implementation file unnecessary for this header as
//inline declarations are used

namespace node_version_0{

class node{

public:

node();
void set_data(int x) {data = x;} //sets the data value of the node
void set_next( node * n) { next = n;} //sets the address to the next node
int get_data() const {return data;} //returns the data value from the node to user
node * next() {return next;}; //returns the address of the next node 
const node * next() const {return next;} //same as above, "write protected"

private:

int data;
node * next;

};//end class node
}//end namespace node_version_0

#endif

Итак, проблема, с которой я сталкиваюсь, связана с файлом реализации connected_list.cpp .

Все вхождения head-> next () выдают ошибку «Выражение должно иметь указатель на тип класса». Та же самая ошибка возникает для всех случаев tail-> whatevers здесь

Так что я уверен, что это что-то простое - но, будучи довольно новичком, я просто не могу понять это. Я знаю, что этот код, вероятно, выглядит небрежно для вас, ребята, ха-ха, поэтому любые ваши указатели будут очень благодарны. К вашему сведению, это школьное задание.

Извините, если форматирование выключено / плохо читается. Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 13 марта 2012

Я бы ожидал, что он провалится раньше, если честно. Из-за порядка ваших включаемых файлов, когда компилятор достигнет объявления вашего linked_list класса, он не будет знать, что такое node. Вот почему я ожидаю, что первая ошибка будет в файле related_list.h.

Из того, что я вижу, Node.h не нужно включать 'connected_list.h`.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...