c++ - 抽象类 - 语法帮助

标签 c++ data-structures syntax abstract-class

我对抽象类有点问题。我有很多类(class)。在 StackAsLinkedList.h 类中,我有一个指向对象的指针的链接列表,如此处所示

LinkedList<Object*> list;

语法错误,我不知道该怎么办。如果我将它命名为 int 或 char,我会得到相同的语法错误。我对 ADT/类层次结构还很陌生 我遇到了很多错误,因为 StackAsLinkedLis.cpp 文件需要识别该列表。

这里只有两个文件。我有将近 14 个 .h 文件,所以我不想发布所有代码。

#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

这是我认为您可能需要查看的另一个头文件

#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

这里是 stack.h incse 你需要看到它和它丢失的东西..

#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

这里是不识别列表的stackaslinklist.cpp文件

#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 (); }

初始化列表无法识别列表

StackAsLinkedList::StackAsLinkedList () : list ()

我得到的一些错误是:注意:第一个错误将我带到我原来的问题:

 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

最佳答案

听起来 LinkedList 类对 StackAsLinkedList 类不可见。在“StackAsLinkedList.h”的顶部包含“LinkedList.h”

关于c++ - 抽象类 - 语法帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4061943/

相关文章:

c++ - 使用 c while 循环循环所有整数数组元素

c++ - 如果编译器是 MSVC,是否定义了预处理器定义?

c - 在 C 中添加到链表的前面

mysql - 删除表并重新创建表

c++ - c语言中bool for function

java - Java中的数据结构,支持快速搜索和删除数组中的重复项

data-structures - 当实际哈希冲突超过 sizeof(Neighborhood) 时,Hopscotch 哈希表中会发生什么?

执行函数后,Python 脚本返回意外的 "None"

c - 如何通过空指针访问成员

c++ - 在默认构造函数签名中返回对象与引用