J'ai un peu de problème avec les classes abstraites. J'ai un tas de classements. Dans la classe StackAsLinkedList.h j'ai une liste chaînée de pointeurs vers des objets comme on le voit iciRésumé des classes - aide de la syntaxe
LinkedList<Object*> list;
La syntaxe est mauvaise et je ne sais pas quoi faire. si je le nomme un int ou char je reçois la même erreur de syntaxe .. Je suis assez nouveau à la hiérarchie ADT/classe Je reçois beaucoup d'erreurs puisque le fichier StackAsLinkedLis.cpp nees à reconnaître cette liste.
Voici seulement les deux fichiers. J'ai près de 14 fichiers .h donc je préfère ne pas poster tout le code.
#pragma once
#include "stack.h"
#include "List_Element.h"
#include "StackAsLinkedList.h"
#ifndef STACKASLINKEDLIST_H
#define STACKASLINKEDLIST_H
class StackAsLinkedList : public Stack
{
LinkedList<Object*> list;
void StackAsLinkedList::Purge();
void StackAsLinkedList::Accept (Visitor& visitor) const;
void StackAsLinkedList::Push (Object& object);
virtual Object& StackAsLinkedList::Pop();
virtual Object& StackAsLinkedList::Top() const;
virtual StackAsLinkedList::~StackAsLinkedList();
class Iter;
public:
StackAsLinkedList();
// ...
friend class Iter;
};
class StackAsLinkedList::Iter : public Iterator
{
StackAsLinkedList const& stack;
virtual ListElement<Object*> const* position;
bool StackAsLinkedList::Iter::IsDone() const;
virtual Object& StackAsLinkedList::Iter::operator *() const;
virtual void StackAsLinkedList::Iter::operator ++();
void StackAsLinkedList::Iter::Reset();
public:
Iter (StackAsLinkedList const&);
// ...
};
#endif
et voici l'autre fichier d'en-tête je pense que vous pourriez avoir besoin de voir
#ifndef Linked_List_H
#define Linked_List_H
#include "List_Element.h"
template <class T>
class LinkedList
{
ListElement<T>* head; // Protected member varable //
ListElement<T>* tail; // Protected member varable //
public:
LinkedList();
~LinkedList();
LinkedList (LinkedList const&);
LinkedList& operator = (LinkedList const&);
ListElement<T> const* Head() const;
ListElement<T> const* Tail() const;
bool IsEmpty() const; // Function to determine if list is empty //
T const& First() const;
T const& Last() const;
void Prepend (T const&); // Function to insert a node in front of the first node of the list //
void Append (T const&); // Function to insert a node in end of the last node of the list //
void Extract (T const&); // Function to extract a node //
void Purge(); // Function to purge all the data from list before deletion //
void InsertAfter (ListElement<T> const*, T const&); // Function to insert node after a specific node in the list //
void InsertBefore (ListElement<T> const*, T const&); // Function to insert node before a specific node in the list //
};
#endif
ici est stack.h incse vous devez le voir et son manque quelque chose ..
#ifndef STACK_H
#define STACK_H
#include "Container.h"
class Stack : public virtual Container
{
public:
virtual Object& Top() const = 0;
virtual void Push (Object&) = 0;
virtual Object& Pop() = 0;
};
#endif
Et voici le fichier stackaslinklist.cpp qui ne reconnaît pas la liste
#include "StackAsLinkedList.h"
#include "NullObject.h"
#include "List_Element.h"
#include "Stack.h"
#include "Linked_List.h"
#include "Container.h"
//void StackAsLinkedList::Accept (Visitor& visitor) const
//{
// ListElement<Object*> const* ptr;
//for (ptr = list.Head();
//ptr != 0 && !visitor.IsDone(); ptr = ptr->Next())
// {
//visitor.Visit (*ptr->Datum());
// }
//}
StackAsLinkedList::StackAsLinkedList() : list()
{
}
void StackAsLinkedList::Purge()
{
if (IsOwner())
{
ListElement<Object*> const* ptr;
for (ptr = list.Head(); ptr != 0; ptr = ptr->Next())
delete ptr->Datum();
}
list.Purge();
count = 0;
}
StackAsLinkedList::~StackAsLinkedList()
{
Purge();
}
void StackAsLinkedList::Push (Object& object)
{
list.Prepend (&object);
++count;
}
Object& StackAsLinkedList::Pop()
{
if (count == 0)
throw domain_error ("stack is empty");
Object& const result = *list.First();
list.Extract (&result);
--count;
return result;
}
Object& StackAsLinkedList::Top() const
{
if (count == 0)
throw domain_error ("stack is empty");
return *list.First();
}
StackAsLinkedList::Iter::Iter (
StackAsLinkedList const& _stack) :
stack (_stack)
{ Reset(); }
bool StackAsLinkedList::Iter::IsDone() const
{ return position == 0; }
Object& StackAsLinkedList::Iter::operator *() const
{
if (position != 0)
return *position->Datum();
else
return NullObject::Instance();
}
void StackAsLinkedList::Iter::operator ++()
{
if (position != 0)
position = position->Next();
}
void StackAsLinkedList::Iter::Reset()
{ position = stack.list.Head(); }
la liste inizializer reconnaît wont liste
StackAsLinkedList::StackAsLinkedList() : list()
Quelques erreurs im obtenir sont: REMARQUE: la première erreur me prend à mon problème d'origine:
LinkedList<Object*> list;
error C2143: syntax error : missing ';' before '<'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2238: unexpected token(s) preceding ';'
error C2433: 'StackAsLinkedList::Iter::position' : 'virtual' not permitted on data declarations
error C2614: 'StackAsLinkedList' : illegal member initialization: 'list' is not a base or member
error C2065: 'list' : undeclared identifier
error C2228: left of '.Head' must have class/struct/union
error C2065: 'list' : undeclared identifier
error C2228: left of '.Purge' must have class/struct/union