Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2011, 14:35   #1
blackbanny
Форумчанин
 
Аватар для blackbanny
 
Регистрация: 02.10.2009
Сообщений: 104
Восклицание очередь на основе массива

когда создаю пустую очередь размерностью 2 в main() вот так BoundQueue <int> a(2);
выводится ошибка:
Код:
main.cpp(13) : error C2259: 'BoundQueue<T>' : cannot instantiate abstract class
пишу в Visual Studio 2008

подскажите в чем дело...

вот код классов:
Queue.h
Код:
#include <iostream>
using namespace std;
#pragma once
template <class T>
class Queue
{
public:
        //Виртуальный деструктор для переопределения в реализациях
        virtual ~Queue() {}
 
        //Операции с абстрактной очередью:
 
        //Добавление элемента в очередь. Может возникнуть ситуация 
        //QueueOverflow, если в очереди нет места для записи нового элемента.
        virtual void enqueue(const T & e) = 0;
 
        //Удаление элемента из головы очереди. Если ни одного элемента
        //в очереди нет, может возникнуть ситуация QueueUnderflow
        virtual void dequeue() = 0;
 
        //Проверка того, что очередь пуста(не имеет ни одного элемента)
        virtual bool empty() const = 0;
 
        //Четыре функции доступа для чтения/записи 
        //элемента в голове и хвосте очереди
        virtual T & head() = 0;
        virtual const T & head() const = 0;
        virtual T & tail() = 0;
        virtual const T & tail() const = 0;
};
BoundQueue.h
Код:
#include "Queue.h"
#include <iostream>
#pragma once
using namespace std;
template <class T> 
class BoundQueue: public Queue<T> 
{
        T *array; //массив элементов очереди
        int MaxSize; //количество элементов в массиве
        int pHead; //индекс первого элемента
        int pTail; //индекс последнего элемента
        int nCount; //количество элементов очереди
 
public:
 
        //Конструктор ограниченной очереди BoundQueue
        BoundQueue(int size);
 
        //Конструктор копирования BoundQueue
        BoundQueue(const BoundQueue<T> & src);
 
        //Деструктор освобождает память, занятую элементами очереди.
        virtual ~BoundQueue() {count = 0; delete[] array;}
 
        //Реализация абстрактных операций над очередью:
 
        //Включение нового элемента в конец очереди
        void enqueue(const T & item);
        //Удаление элемента из головы очереди
        void dequeue();
        //Проверка очереди на пустоту
        bool empty() {return nCount;}
        //Доступ к головному элементу очереди
        T & head();
        const T & head() const;
        //Доступ к хвостовому элементу очереди
        T & tail();
        const T & tail() const;
};
 
//Конструктор нового пустого стека
template <class T> BoundQueue<T>::BoundQueue(int size)
{
        try
        {
                array = new T[MaxSize = size];
        }
        catch(...)
        {
                throw WrongQueueSize("Incorrect size!");
        }
        count = 0;
}
 
//Конструктор копирования 
template <class T> BoundQueue<T>::BoundQueue(const BoundQueue<T> &src)
{
        //Прежде всего выделяется новая память под элементы нового массива
        try
        {
                array = new T[MaxSize = src.MaxSize];
        }
        catch(...) 
        {
        throw WrongStackSize("Incorrect size!");
        }
        //Теперь производится копирование элементов 
        count = src.count;
        for(int i = 0; i < count; i++) array[i] = src.array[i];
}
 
template <class T> void BoundQueue<T>::enqueue(const T &item)
{
        //Проверка, есть ли в массиве место для нового элемента 
        if(nCount == MaxSize) throw QueueOverflow();
        //Помещение элемента в массив
        if(++pTail == MaxSize) pTail = 0;
        array[pTail] = item;
        nCount++;
}
 
template <class T> void BoundQueue<T>::dequeue()
{
        //Проверка, есть ли в очереди хоть один элемент
        if(nCount == 0) throw QueueUnderflow();
        if(++pHead == MaxSize) pHead = 0;
        //Уменьшение счетчика числа элементов
        nCount--;
}
 
template <class T> T & BoundQueue<T>::head()
{
        //Проверка, есть ли в очереди хоть один элемент
        if(nCount == 0) throw QueueUnderflow();
        //Результат - ссылка на головной элемент
        return array[pHead];
}
 
template <class T> const T & BoundQueue<T>::head() const
{
        //Проверка, есть ли в очереди хоть один элемент
        if(nCount == 0) throw QueueUnderflow();
        //Результат - ссылка на головной элемент
        return array[pHead];
}
 
template <class T> T & BoundQueue<T>::tail()
{
        //Проверка, есть ли в очереди хоть один элемент
        if(nCount == 0) throw QueueUnderflow();
        //Результат - ссылка на хвостовой элемент
        return array[pTail];
}
 
template <class T> const T & BoundQueue<T>::tail() const
{
        //Проверка, есть ли в очереди хоть один элемент
        if(nCount == 0) throw QueueUnderflow();
        //Результат - ссылка на хвостовой элемент
        return array[pTail];
}
blackbanny вне форума Ответить с цитированием
Старый 14.01.2011, 14:42   #2
blackbanny
Форумчанин
 
Аватар для blackbanny
 
Регистрация: 02.10.2009
Сообщений: 104
По умолчанию

нашел ошибку надо было не virtual bool empty() const = 0;
а virtual bool empty() = 0;
blackbanny вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем отличается Очередь на базе списка от Очереди на базе массива? TwiX Общие вопросы C/C++ 7 16.02.2011 12:17
дек на основе динамического массива Aндрей Общие вопросы C/C++ 0 28.10.2010 21:11
Очередь Си svetikzo Помощь студентам 0 23.01.2010 10:03
Очередь C++ svetikzo Помощь студентам 2 23.01.2010 09:53
Очередь Юлькин Общие вопросы C/C++ 4 30.05.2009 16:00