【问题标题】:LinkedList class implementation cannot declare variable to be of Abstract TypeLinkedList 类实现不能将变量声明为抽象类型
【发布时间】:2021-12-07 20:36:56
【问题描述】:

我在构建 LinkedList 类时哪里出错了?

我已经在你的 LinkedList 类中重新声明了来自 IList 的纯虚拟方法,但 LinkedList 似乎被视为抽象类,因此编译器似乎不允许我这样做在我的 main 函数中创建一个 LinkedList 对象:

ma​​in.cpp

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

LinkedList.h

#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

LinkedList.cpp

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

IList.h

//  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

【问题讨论】:

    标签: c++ class oop inheritance abstract-class


    【解决方案1】:

    您的IList 是一个具有六个纯虚成员函数的抽象类。为了创建派生实例的实例(即LinkedList),您需要implement those functions inside the child as well

    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 specifier 覆盖基类中的虚函数,这样编译器和读者都可以轻松识别它们,而无需查看基类。

    其他问题:

    【讨论】:

    • 嗨 Jejo,这很有帮助。我实施了您的更改。我现在从 main.cpp 中收到错误,因为我的构造函数、析构函数、getCurrentSize 和显示方法有未定义的引用。
    猜你喜欢
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    相关资源
    最近更新 更多