不能将变量'test'声明为抽象类型'OurStack <int>'

时间:2017-04-14 20:54:09

标签: c++ stack abstract-class virtual

我一直在寻找类似的答案,他们都有错误的参数或错别字。

我正在尝试创建一个int类型的堆栈,但是我遇到了push函数的问题。

确切的错误是:

 OurStack<int> test;
               ^
In file included from StackTester.cpp:5:0:
OurStack.h:7:7: note:   because the following virtual functions are pure within 'OurStack<int>':
 class OurStack : public StackInterface<T>
       ^
In file included from OurStack.h:4:0,
                 from StackTester.cpp:5:
StackInterface.h:11:15: note:   bool StackInterface<T>::push(const T&) [with T = int]
  virtual bool push(const T& newEntry) = 0;

这是我的代码:

StackInterface.h

/** @file StackInterface.h */ 
#ifndef _STACK_INTERFACE
#define _STACK_INTERFACE 
template<class T> class StackInterface 
 { public: 

    /** Sees whether this stack is empty. @return True if the stack is empty, or false if not. */ 
virtual bool isEmpty() const = 0;

/** Adds a new entry to the top of this stack. @post If the operation was successful, newEntry is at the top of the stack. @param newEntry The object to be added as a new entry. @return True if the addition is successful or false if not. */ 
virtual bool push(const T& newEntry) = 0; 

/** Removes the top of this stack. @post If the operation was successful, the top of the stack has been removed. @return True if the removal is successful or false if not. */ 
virtual bool pop() = 0;

/** Returns the top of this stack. @pre The stack is not empty. @post The top of the stack has been returned, and the stack is unchanged. @return The top of the stack. */
virtual T peek() const = 0;
};

// end StackInterface 
#endif

OurStack.h

#ifndef _STACK_H_
#define _STACK_H_

#include "StackInterface.h"

template <class T>
class OurStack : public StackInterface<T>
{
    private:
    std::stack<T> ourStack;

    public:
        OurStack();
        bool isEmpty() const;
        bool push(const T& newEntry) const;
        bool pop();
        T peek() const;

};
#include "OurStack.cpp"
#endif

OurStack.cpp

#include "OurStack.h"

template <class T>
OurStack<T>::OurStack()
{
    //not much to do between these
}

template <class T>
bool OurStack<T>::isEmpty() const
{
    return ourStack.empty();
}

template <class T>
bool OurStack<T>::push(const T& newEntry) const
{
    ourStack.push(&newEntry);
    return true;
}

template <class T>
bool OurStack<T>::pop()
{
    if(ourStack.empty() == true)
        return false;
    else
    {
        ourStack.pop();
        return true;
    }
}

template <class T>
T OurStack<T>::peek() const
{
    return ourStack.top();
}

StackTester.cpp

#include <iostream>
#include <cstdlib>
#include <string>
#include <stack>
#include "OurStack.h"

using namespace std;

OurStack<int> test;
int any;

int main()
{
    cout<<"press any number";
    cin>>any;
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您声明bool OurStack<T>::push(const T& newEntry) const;,但您的基类声明bool push(const T& newEntry);push不是const。使用override关键字可以避免这些问题。

template <class T>
class OurStack : public StackInterface<T>
{
    private:
    std::stack<T> ourStack;

    public:
        OurStack();
        bool isEmpty() const override; // Compiles
        bool push(const T& newEntry) const override; // Doesn't compile
        bool pop() override; // Compiles
        T peek() const override; // Compiles

};

答案 1 :(得分:0)

推送功能如何:

   bool push(const T& newEntry) const;

可能是const?

此外,这样的名字:

   _STACK_H_

保留用于实施。只需使用:

   STACK_H