我在構建我的LinkedList班級時哪里出錯了?
我已經IList在您的LinkedList類中重新宣告了純虛擬方法,但LinkedList似乎被視為抽象類,因此編譯器似乎不允許我LinkedList在我的main函式中創建物件:
主程式
#include <iostream>
#include <string>
#include "LinkedList.h"
using namespace std;
int main()
{
int A[] {1, 2, 3, 4, 5};
LinkedList l(A, 5);
cout << l.getCurrentSize()<<endl;
l.display();
return 0;
}
鏈表
#ifndef LINKED_LIST_
#define LINKED_LIST_
#include "IList.h"
class LinkedList : public IList
{
protected:
struct Node
{
int data;
struct Node* next;
};
struct Node* first;
public:
// constructor
LinkedList() { first = nullptr; }
LinkedList(int A[], int n);
// accessors void display();
virtual int getCurrentSize();
//destructor
virtual ~LinkedList();
};
#endif
鏈表檔案
#include <iostream>
#include <string>
#include "LinkedList.h"
using namespace std;
// constructor
LinkedList::LinkedList(int A[], int n)
{
Node* last, * t;
int i = 0;
first = new Node;
first->data = A[0];
first->next = nullptr;
last = first;
for (i = 1; i < n; i )
{
t = new Node;
t->data = A[i];
t->next = nullptr;
last->next = t;
last = t;
}
};
// destructor
LinkedList::~LinkedList()
{
Node* p = first;
while (first) {
first = first->next;
delete p;
p = first;
}
}
void LinkedList::display()
{
Node* p = first;
while (p)
{
cout << p->data >> " ";
p = p->next;
}
cout << endl;
}
int LinkedList::getCurrentSize() const
{
Node* p = first;
int len = 0;
while (p)
{
len ;
p = p->next;
}
return len;
}
串列檔案
// Modified from code created by Frank M. Carrano and Timothy M. Henry.
// Copyright (c) 2017 Pearson Education, Hoboken, New Jersey.
#ifndef I_LIST_
#define I_LIST_
class IList
{
public:
/** Constructor */
IList () : traverseCount(0) { }
/** Destroys object and frees memory allocated by object.
(See C Interlude 2) */
virtual ~IList () { }
/** Gets the current number of entries in this list.
@return The integer number of entries currently in the list. */
virtual int getCurrentSize() const = 0;
/** Sees whether this list is empty.
@return True if the list is empty, or false if not. */
virtual bool isEmpty() const = 0;
/** Adds a new entry to this list.
@post If successful, newEntry is stored in the list and
the count of items in the list has increased by 1.
@param newEntry The object to be added as a new entry.
@return True if addition was successful, or false if not. */
virtual bool add(int newEntry) = 0;
/** Removes one occurrence of a given entry from this list,
if possible.
@post If successful, anEntry has been removed from the list
and the count of items in the list has decreased by 1.
@param anEntry The entry to be removed.
@return True if removal was successful, or false if not. */
virtual bool remove(int anEntry) = 0;
/** Removes all entries from this list.
@post List contains no items, and the count of items is 0. */
virtual void clear() = 0;
/** Tests whether this list contains a given entry.
@param anEntry The entry to locate.
@return True if list contains anEntry, or false otherwise. */
virtual bool contains(int anEntry) = 0;
/** Get the count of number of nodes traversed.
@return The integer number of nodes traversed since last time the count was reset. */
virtual int getTraverseCount() const { return traverseCount; }
/** Reset the count of nodes traversed to zero. */
virtual void resetTraverseCount() { traverseCount = 0; }
protected:
int traverseCount;
}; // end IList
#endif
uj5u.com熱心網友回復:
你IList是一個抽象類,有六個純虛成員函式。為了創建派生實體(即LinkedList),您還需要在子組件中實作這些函式。
class LinkedList : public IList
{
// ..... other members
public:
// ..... other members
virtual int getCurrentSize() const override;
bool isEmpty() const override { // implementation }
bool add(int newEntry) override {// implementation }
bool remove(int anEntry) override { // implementation }
bool contains(int anEntry) override { // implementation }
void clear() override { // implementation}
};
還建議使用說明override符覆寫基類中的虛函式,以便編譯器和讀者都可以輕松識別它們,而無需查看基類。
其他事宜:
- 另請注意,
getCurrentSize()子類(即LinkedList)中的函式宣告缺少const. - 錯別字
cout << p -> data >> " ";應該是cout << p->data << " "; - 為什么是“使用命名空間 std;” 被認為是不好的做法?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329041.html
上一篇:如何在回圈中更改實體屬性的值
