2017-04-14 1 views
0

J'ai regardé des réponses similaires et ils avaient tous les paramètres faux ou fautes de frappe.ne peut pas déclarer la variable 'test' pour être de type abstrait 'OurStack <int>'

J'essaye de créer une pile de type int, mais j'ai des problèmes avec la fonction push.

L'erreur exacte est:

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; 

Voici mon code:

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; 
} 
+0

utilisez-vous Visual Studio? – Omore

+0

nope, notepad ++ –

Répondre

2

Vous déclarez bool OurStack<T>::push(const T& newEntry) const; mais votre classe de base Déclare bool push(const T& newEntry);. push n'est pas const. Utilisez le mot-clé override pour éviter ces problèmes.

+0

Merci, il était const dans la StackInterface fourni et il semblait étrange, doit avoir été une erreur edit: non ce n'était pas, j'ai fait l'erreur. probablement mieux –

0

Comment une fonction push:

bool push(const T& newEntry) const; 

peut-être const?

En outre, les noms comme celui-ci:

_STACK_H_ 

sont réservés à la mise en œuvre. utilisez simplement:

STACK_H